Парсинг двоичных файлов;В чем разница между этими двумя звонками? - PullRequest
2 голосов
/ 03 декабря 2011
// 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 читает каждую переменную члена структуры по отдельности (а затем записывает их в порядке с прямым порядком байтов). Вместо этого я ожидал, что (1) прочитает всю структуру как один непрерывный блок и начнет записывать двоичные данные, начиная с конца этого блока (а не с конца первой переменной-члена).

Мысли?

1 Ответ

5 голосов
/ 03 декабря 2011

Если вы используете архитектуру с прямым порядком байтов, целые структуры не сохраняются в обратном порядке; только целые числа, указатели и другие числовые значения.

Таким образом, когда у вас есть структура, содержащая два WORD s, каждый WORD сохраняется в порядке с прямым порядком байтов, но сами поля не переключаются в памяти. Когда у вас есть один DWORD, это один блок, и он будет храниться в порядке с прямым порядком байтов.

...