我有一个C程序中的代码,其中包含我想要迭代的十六进制数据,例如,打印出每个十六进制字节:
char input[] = "\x31\xd2\xb2\x30";
for (int i = 0; i < strlen(input); i++) {
printf("%02X\n", input[i]);
}
但是,输出与我所期望的不一样,例如上面的打印:
31
FFFFFFD2
FFFFFFB2
30
我还试图将输出转换为(unsigned int)
,但是接收到相同的输出。
有人能用这个简单的脚本指出问题吗?
发布于 2017-09-10 20:23:01
传递给printf的参数是符号扩展的,除非您将它们转换为如下所示的无符号类型:
printf("%02X\n", (unsigned char)input[i]);
发布于 2017-09-10 20:33:12
printf("%02X")
需要一个无符号整数;传递char
类型的负值( char
类型的0xD2
是负值)将导致将负char值提升到32位无符号int,从而用1
填充前导位,最后生成0xFFFFFFD2
。然后印上这张。
要克服这一问题,您可以“告诉”printf
将提供的值作为8位值:
printf("%02hhX\n", input[i])
另一种选择是将input
声明为unsigned char
,因为这样0xD2
就不会被认为是“负面的”,提升到32位将如预期的那样工作:
unsigned char input[] = "\x31\xd2\xb2\x30";
请注意,然后strlen
将需要转换输入,即strlen((char*)intput)
。
发布于 2017-09-10 20:22:13
char input[]
一定是unsigned char input[]
。这就是二进制字节的存储方式。
https://stackoverflow.com/questions/46145173
复制相似问题