C打印十六进制

时间:2013-11-05 19:26:37

标签: 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");

以下是结构的定义:

struct someStruct {
   unsigned char a;
   short myShort;
} __attribute__((packed)) someStruct;

按预期打印出的结构的长度是(在控制台上输出):

  

sizeof(someStruct):3个字节

这里的问题是我遇到的以下问题。我设置了一个短值。

someStruct.myShort = 0x08;

现在这个短片长2个字节。然而,当它打印到控制台时,它不会显示最重要的0x00。这是我得到的输出,

stderr: 00 08

我想要以下输出(3个字节长),

stderr: 00 00 08 

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

关于我做错了什么的任何想法。可能是我认为我会忽略的小事。

5 个答案:

答案 0 :(得分:1)

我发现您的代码没有问题。但是,我得到08 00,这在我的小端英特尔机器上是有意义的。

答案 1 :(得分:1)

在您提供更多信息后,您的代码对我来说没问题。它打印输出:

00 08 00

首先00来自unsigned char a;,第二个字节08 00来自short。由于存储在内存中的平台相关数据,它们被切换。

如果你想要短切换字节,你可以只显示short

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

答案 2 :(得分:0)

问题在于printf的格式

%02x

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

尝试

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

答案 3 :(得分:0)

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

对于数字分组(00 08而不是0008):普通旧printf不支持,但POSIX printf会支持。信息在这里:Digit grouping in C's printf

答案 4 :(得分:0)

如果buffer签名,请注意不要转移已签名的位。使用"hh"仅打印1个字节的数据。 C99提供"hh"。见What is the purpose of the h and hh modifiers for printf?

fprintf(stderr, "%02hhx %02hhx", buffer[count] >> 8, buffer[count]);

[编辑OP的最新编辑想要看到3个字节]这将打印所有字段的内容。每个字段都以机器的字节顺序排列。

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");