首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C打印十六进制字节

C打印十六进制字节
EN

Stack Overflow用户
提问于 2017-09-10 20:16:48
回答 4查看 8.8K关注 0票数 0

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

代码语言:javascript
运行
复制
char input[] = "\x31\xd2\xb2\x30";
for (int i = 0; i < strlen(input); i++) {
    printf("%02X\n", input[i]);
}

但是,输出与我所期望的不一样,例如上面的打印:

代码语言:javascript
运行
复制
31
FFFFFFD2
FFFFFFB2
30

我还试图将输出转换为(unsigned int),但是接收到相同的输出。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-10 20:23:01

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

代码语言:javascript
运行
复制
printf("%02X\n", (unsigned char)input[i]);
票数 2
EN

Stack Overflow用户

发布于 2017-09-10 20:33:12

printf("%02X")需要一个无符号整数;传递char类型的负值( char类型的0xD2是负值)将导致将负char值提升到32位无符号int,从而用1填充前导位,最后生成0xFFFFFFD2。然后印上这张。

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

代码语言:javascript
运行
复制
printf("%02hhX\n", input[i]) 

另一种选择是将input声明为unsigned char,因为这样0xD2就不会被认为是“负面的”,提升到32位将如预期的那样工作:

代码语言:javascript
运行
复制
unsigned char input[] = "\x31\xd2\xb2\x30";

请注意,然后strlen将需要转换输入,即strlen((char*)intput)

票数 1
EN

Stack Overflow用户

发布于 2017-09-10 20:22:13

char input[]一定是unsigned char input[]。这就是二进制字节的存储方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46145173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档