我在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)
,但是我收到了相同的输出。
有人可以用这个简单的脚本指出问题吗?
答案 0 :(得分:1)
传递给printf的参数是符号扩展的,除非你将它们转换为这样的无符号类型:
printf("%02X\n", (unsigned char)input[i]);
答案 1 :(得分:1)
printf("%02X")
期望无符号整数;传递类型为char
的负值(以及类型0xD2
的{{1}}为负值)将导致将负char值提升为32位无符号整数,从而填补领先优势最后得到char
并产生1
的位。然后打印出来。
为了克服这一点,你可以告诉&#34; 0xFFFFFFD2
将提供的值作为8位值:
printf
另一种选择是将printf("%02hhX\n", input[i])
声明为input
,因为unsigned char
将不会被视为&#34;否定&#34;,并且促销到32位将按预期工作:
0xD2
请注意,然后unsigned char input[] = "\x31\xd2\xb2\x30";
需要投射输入,即strlen
。
答案 2 :(得分:0)
char input[]
必须为unsigned char input[]
。这就是你如何存储二进制字节。
答案 3 :(得分:0)
strlen((char*)intput)
它将屏蔽高位并仅保留低8位。