C打印十六进制

C打印十六进制,c,hex,stderr,printf,C,Hex,Stderr,Printf,好的,我试着打印一个结构的十六进制值。现在,我的打印功能执行以下操作: int len = sizeof(someStruct); unsigned char *buffer = (unsigned char*)&someStruct; int count; for(count = 0; count < len; count++) { fprintf(stderr, "%02x ", buffer[count]); } fprintf(stderr, "\n"); 按预期

好的,我试着打印一个结构的十六进制值。现在,我的打印功能执行以下操作:

int len = sizeof(someStruct);
unsigned char *buffer = (unsigned char*)&someStruct;
int count;
for(count = 0; count < len; count++) {
    fprintf(stderr, "%02x ", buffer[count]);
}
fprintf(stderr, "\n");
按预期打印出的此结构的长度为(控制台上的输出):

sizeof(someStruct):3个字节

我遇到的问题如下。有一个短路,我设置为一个值

someStruct.myShort = 0x08;
现在这个短的是2字节长。但是,当它打印到控制台中时,它不会显示最重要的0x00。这是我得到的输出

stderr: 00 08
但是,我想要以下输出(3字节长)

如果我用0xFFFF填充短字符,那么我会得到2字节的输出,但是,只要有前导0x00,它就不会将前导0x00输出到控制台


任何关于我做错了什么的想法。可能是一些我认为我忽略的小问题。

问题在于printf的格式

%02x
%02x表示结果将打印为十六进制值(x),最小长度为2(2),并用0(0)填充空格

试一试

fprintf(stderr, "%04x ", buffer[count]); 

格式字符串中的宽度说明符(
2
在您的情况下)指的是文本输出中的最小字符数,而不是要打印的字节数。尝试使用
“%04x”
作为格式字符串


至于数字分组(
0008
而不是
0008
):纯旧的
printf
不支持,但POSIX
printf
支持。这里的信息:

我看你的代码没有问题。然而,我得到了
08 00
,这在我的小endian Intel机器上是有意义的。

需要注意的是,如果
缓冲区
被签名,就不要在签名位中移动。使用
“hh”
仅打印1字节的数据<代码>“hh”随C99提供。看


[编辑OP的最新编辑希望看到3个字节]这将打印所有字段的内容。每个字段按机器的endian顺序排列

size_t len = sizeof(someStruct);
const unsigned char *buffer = (unsigned char*)&someStruct;
size_t count;
for(count = 0; count < len; count++) {
    fprintf(stderr, "%02x ", buffer[count]);
}
fprintf(stderr, "\n");
size\u t len=sizeof(someStruct);
常量unsigned char*buffer=(unsigned char*)&someStruct;
大小/数量;
用于(计数=0;计数
在您提供了更多信息后,您的代码对我来说就可以了。它打印输出:

00 08 00

第一个
00
来自
无符号字符a和第二个字节
08 00
来自
short
。由于依赖于平台的数据存储在内存中,因此它们被切换

如果要切换短字符的字节,可以只显示一个
短字符

fprintf(stderr, "%02x %02x", (someStruct.myShort >> 8) & 0xFF, someStruct.myShort & 0xFF)

假设
buffer=(unsigned char*)&someStruct;len=sizeof(someStruct)
我看不出您的代码有任何错误。您可以发布一个自包含的示例来演示您的问题吗?输出(在小型endian机器上)应该是
nn 08 00
,其中
nn
是第一个结构成员
a
的值。如果
len=sizeof(someStruct)=3
,则代码应打印三个十六进制字节。请提供程序的实际输出。如果你的长度(sizeof)是3,你应该看到
xx xx xx
,而不是一个
xx
@Edwin:这很奇怪,我无法复制它。那是你真正的密码吗?你在调试器中尝试单步执行了吗?我将尝试使用调试器,这里出现了一些可疑的情况…嗨,Evan,问题是我在函数中按字节打印它。所以这意味着打印%04x将像这样打印:0008。但请注意,这不是我想要的2个字节,它只是用前导0打印的单字节。这不是我们想要的。@Edwin:你的问题不清楚。在您的代码示例中,
buffer
someStruct.myShort
之间没有连接,因此很难理解您要查找的内容。您好,Fred,请注意,正在打印的结构逐字节打印。缓冲区[计数]是一个单字节(无符号字符)。因此,虽然您的04x将工作在面值,它并不完全打印的短。它只是用0填充字节,而不是打印出字节的前导0x00short@Edwin:您的代码示例没有说明这一点。如果
buffer[count]
为0xF123,
msb
变为
fff2
fprintf(stderr,“%02x”,msb)
打印
fffffff2
,请显示
buffer
的声明和分配,基本上,问题在于系统的持久性以及外壳上的配置错误,这使得它跳过了一些打印。
fprintf(stderr, "%02hhx %02hhx", buffer[count] >> 8, buffer[count]);
size_t len = sizeof(someStruct);
const unsigned char *buffer = (unsigned char*)&someStruct;
size_t count;
for(count = 0; count < len; count++) {
    fprintf(stderr, "%02x ", buffer[count]);
}
fprintf(stderr, "\n");
fprintf(stderr, "%02x %02x", (someStruct.myShort >> 8) & 0xFF, someStruct.myShort & 0xFF)