0

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

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 填充short,那么我会得到 2 字节输出,但是,只要有前导 0x00,它就不会将前导 0x00 输出到控制台。

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

4

5 回答 5

1

我看不出你的代码有问题。但是,我得到08 00了 ,这在我的小端英特尔机器上是有意义的。

于 2013-11-05T19:38:08.670 回答
1

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

00 08 00

第一个00是 from unsigned char a;,第二个字节08 00是 from short。由于平台相关的数据存储在内存中,因此它们被切换。

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

fprintf(stderr, "%02x %02x", (someStruct.myShort >> 8) & 0xFF, someStruct.myShort & 0xFF)
于 2013-11-05T19:42:36.540 回答
0

问题在于 printf 的格式

%02x

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

尝试

fprintf(stderr, "%04x ", buffer[count]); 
于 2013-11-05T19:36:06.293 回答
0

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

至于数字分组(00 08相对于0008):Plain oldprintf不支持,但 POSIX 支持printf。此处的信息:C 的 printf 中的数字分组

于 2013-11-05T19:36:20.870 回答
0

需要注意不要在有符号位中移位,应该buffer有符号。用于"hh"仅打印 1 个字节的数据。 "hh"可用于 C99。请参阅printf 的 h 和 hh 修饰符的用途是什么?

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

[Edit OP's latest edit want to see 3 bytes] 这将打印所有字段的内容。每个字段都是机器的字节序。

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");
于 2013-11-05T19:39:17.970 回答