我正在尝试将打包的数据结构写出到二进制文件中,但是正如您从od -x下面看到的那样,结果的顺序并不符合预期。我在 64 位 Intel 系统上使用 gcc。有谁知道为什么顺序是错误的?它看起来不像字节序问题。
#include <stdio.h>
#include <stdlib.h>
struct B {
char a;
int b;
char c;
short d;
} __attribute__ ((packed));
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen("temp.bin", "w");
struct B b = {'a', 0xA5A5, 'b', 0xFF};
if (fwrite(&b, sizeof(b), 1, fp) != 1)
printf("Error fwrite\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
ASCII 61 是'a',所以b.a成员。ASCII 62 是'b',所以b.c成员。奇怪的0xA5A5是如何在序列中展开。
$ od -x temp.bin
0000000 a561 00a5 6200 00ff
0000010
Run Code Online (Sandbox Code Playgroud)
od -x将输入分组为 2 字节单元并交换它们的字节序。这是一种令人困惑的输出格式。用于-t x1单独保留字节。
$ od -t x1 temp.bin
0000000 61 a5 a5 00 00 62 ff 00
0000010
Run Code Online (Sandbox Code Playgroud)
或者,更容易记住,使用hd(hex dump) 而不是od(octal dump)。hd的默认格式不需要调整,而且它同时显示了十六进制和 ASCII 转储。
$ hd temp.bin
00000000 61 a5 a5 00 00 62 ff 00 |a....b..|
00000008
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |