C打印十六进制字节

时间:2017-09-10 20:16:48

标签: c printing printf

我在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),但是我收到了相同的输出。

有人可以用这个简单的脚本指出问题吗?

4 个答案:

答案 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位。