我使用以下命令以十六进制形式打印数组中的数字:
char buff[1000];
// Populate array....
int i;
for(i = 0; i < 1000; ++i)
{
printf("[%d] %02x\n", i,buff[i]);
}
但我有时会打印奇怪的值:
byte[280] 00
byte[281] 00
byte[282] 0a
byte[283] fffffff4 // Why is this a different length?
byte[284] 4e
byte[285] 66
byte[286] 0a
为什么会打印“fffffff4”?
最佳答案
使用%02hhx
作为格式字符串。
来自CppReference , %02x
接受 unsigned int
。当您将参数传递给 printf()
时,即 variadic function , buff[i]
自动转换为 int
。然后格式说明符 %02x
使 printf()
将值解释为 int
,因此潜在的负值如 (char)-1
被解释并打印为 (int)-1
,这就是您观察到的情况的原因。
还可以推断您的平台有签名char
类型,以及32位int
类型。
长度修饰符 hh
将告诉 printf()
解释以 char
类型提供的任何内容,因此 %hhx
是 unsigned char
的正确格式说明符。
或者,您可以在打印之前将数据转换为 unsigned char
。喜欢
printf("[%d] %02x\n", i, (unsigned char)buff[i]);
这还可以防止负值显示太长,因为 int
可以(几乎)始终包含 unsigned char
值。
请参阅以下示例:
#include <stdio.h>
int main(){
signed char a = +1, b = -1;
printf("%02x %02x %02hhx %02hhx\n", a, b, a, b);
return 0;
}
上述程序的输出为:
01 ffffffff 01 ff
关于c++ - C/C++ 以十六进制打印字节,得到奇怪的十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825418/