c++ - 使用 sprintf 转换和打印十六进制值(保持前导零)
问题描述
我有以下 C 代码,它采用两个长整数值并使用 sprintf 函数将它们转换为两个十六进制字符串:
void reverse_and_encode(FILE *fpt, long *src, long *dst) {
char reversed_src[5], reversed_dst[5];
sprintf(reversed_src, "%x", *dst);
sprintf(reversed_dst, "%x", *src);
printf("Reversed Source: %s\n", reversed_src);
printf("Reversed Destination: %s\n", reversed_dst);
}
但是当我打印十六进制值字符串时,我无法在输出中获得前导零。例如。
Reversed Source: f168 // for integer 61800
Reversed Destination: 1bb // This output should be "01bb" for integer 443
解决方案
采用
sprintf(reversed_src, "%04x", ( unsigned int )*dst);
请注意,如果表达式2 * sizeof( long )
(十六进制数字的数量)可以等于 8 或 16。对于 long 类型的对象,请注意这一点。所以你需要像这样声明数组
char reversed_src[2 * sizeof( long ) + 1], reversed_dst[2 * sizeof( long ) + 2];
然后写例如
sprintf(reversed_src, "%0*lx",
( int )( 2 * sizeof( long ) ), ( unsigned long )*dst);
这是一个演示程序。
#include <stdio.h>
int main(void)
{
enum { N = 2 * sizeof( long ) };
char reversed_src [N + 1];
long x = 0xABCDEF;
sprintf( reversed_src, "%0*lX", N, ( unsigned long )x );
puts( reversed_src );
return 0;
}
程序输出为
0000000000ABCDEF
推荐阅读
- c# - app.config 上的 C# ConnectionString 在其他计算机上不起作用
- ios - SceneKit 中的平滑着色
- c# - 在 PHP 中复制散列 C# 算法
- javascript - 拒绝 javascript Promise
- python - 在类中使用数据框的最佳方法?
- php - 未返回来自服务器的 HTTP 响应
- c# - 有没有办法将 Storyboard 与 ListView/GridView 项目一起使用?
- clojure - 重新投资戒指。Luminus 上仅在一组路由中进行身份验证和授权
- javascript - 循环浏览页面上的链接并单击每个链接,尽管重新呈现
- matlab - 我必须将音频信号分割成几个片段,我应该可以访问每个片段