C 打印十六进制字节

C 打印十六进制字节,c,printing,printf,C,Printing,Printf,我有一个C程序中的代码,其中包含十六进制数据,我想对其进行迭代,例如打印出每个十六进制字节: char input[] = "\x31\xd2\xb2\x30"; for (int i = 0; i < strlen(input); i++) { printf("%02X\n", input[i]); } 我还尝试将输出强制转换为(unsigned int),但是我收到了相同的输出 有人能指出这个简单脚本的问题吗?字符输入[]必须是无符号字符输入[]。这就是存储二进制字节的方式。

我有一个C程序中的代码,其中包含十六进制数据,我想对其进行迭代,例如打印出每个十六进制字节:

char input[] = "\x31\xd2\xb2\x30";
for (int i = 0; i < strlen(input); i++) {
    printf("%02X\n", input[i]);
}
我还尝试将输出强制转换为
(unsigned int)
,但是我收到了相同的输出


有人能指出这个简单脚本的问题吗?

字符输入[]
必须是
无符号字符输入[]
。这就是存储二进制字节的方式。

字符输入[]
必须是
无符号字符输入[]
。这就是存储二进制字节的方式。

传递给printf的参数是符号扩展的,除非您将它们转换为如下无符号类型:

printf("%02X\n", (unsigned char)input[i]);

传递给printf的参数是符号扩展的,除非将其强制转换为以下无符号类型:

printf("%02X\n", (unsigned char)input[i]);
printf(“%02X”)
需要一个无符号整数;传递
char
类型的负值(而
char
类型的
0xD2
是负值)将导致将负char值提升为32位无符号整数,从而用
1
填充前导位,并最终产生
0xffffd2
。然后将其打印出来

要克服此问题,您可以“告诉”
printf
将提供的值作为8位值:

printf("%02hhX\n", input[i]) 
另一个选项是将
输入
声明为
无符号字符
,因为这样
0xD2
将不会被视为“负”,并且升级到32位将按预期工作:

unsigned char input[] = "\x31\xd2\xb2\x30";
请注意,
strlen
需要强制转换输入,即
strlen((char*)intput)
printf(“%02X”)
需要一个无符号整数;传递
char
类型的负值(而
char
类型的
0xD2
是负值)将导致将负char值提升为32位无符号整数,从而用
1
填充前导位,并最终产生
0xffffd2
。然后将其打印出来

要克服此问题,您可以“告诉”
printf
将提供的值作为8位值:

printf("%02hhX\n", input[i]) 
另一个选项是将
输入
声明为
无符号字符
,因为这样
0xD2
将不会被视为“负”,并且升级到32位将按预期工作:

unsigned char input[] = "\x31\xd2\xb2\x30";
请注意,
strlen
需要强制转换输入,即
strlen((char*)intput)

//您可以这样使用
字符输入[]=“\x31\xd2\xb2\x30”;
对于(inti=0;i
它将屏蔽高位,只保留低位8位。

//您可以这样使用
字符输入[]=“\x31\xd2\xb2\x30”;
对于(inti=0;i

它将屏蔽高位,只保留低位8位。

哦,你说得对。我用了一个无符号的int,但当然是char。哦,你说得对。我使用了一个无符号的int,但它当然是char。在您的系统中,
char
可能是
signed
。因此数据
\xd2
为负数。将该值传递给
printf
,它将被提升为
int
,该值也被签名。但是格式说明符
%X
需要一个
无符号int
,并相应地解释二进制数据。这是未定义的行为。在您的系统上,
char
可能是
signed
。因此数据
\xd2
为负数。将该值传递给
printf
,它将被提升为
int
,该值也被签名。但是格式说明符
%X
需要一个
无符号int
,并相应地解释二进制数据。这是未定义的行为。