二进制文件解析;这两个电话有什么区别?

时间:2011-12-03 05:08:20

标签: c binary endianness

// assume file points to a file

struct myStruct
{
     WORD word;
     WORD word2;
};

两个竞争代码:(1)

myStruct a;
a.word = 0xABCD;
a.word2 = 0xFADB;
fwrite(&a, sizeof(myStruct), 1, file);

output:
cdab dbfa

对:(2)

DWORD word = 0xABCDFADB;
fwrite(&word, sizeof(DWORD), 1, file);

output:
dbfa cdab

我的问题是:为什么fwrite不适合编写结构?我假设(1)将等效输出到(2)。但是,fwrite会单独读取每个struct成员变量(然后以little-endian顺序写入它们)。相反,我期望(1)将整个结构读取为一个连续的块,并开始从该块的末尾开始编写二进制数据(而不是在第一个成员变量的末尾)。

思考?

1 个答案:

答案 0 :(得分:5)

如果你是一个小端架构,整个结构不会向后存储;只有整数,指针和其他数值。

因此,当你有一个包含两个WORD s的结构时,每个WORD都以little-endian顺序存储,但字段本身不会在内存中切换。当你有一个DWORD时,这是一个单位,它将以小端存储。