LINUX.ORG.RU

СИ - структура и выравнивание


0

0

СИ - структура и выравнивание

Язык СИ
ОС UNIX

создаю структуру

typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 2 байта
DWORD bfSize; // 4 байта
WORD bfReserved1; // 2 байта
WORD bfReserved2; // 2 байта
DWORD bfOffBits; // 4 байта
} BITMAPFILEHEADER;

BITMAPFILEHEADER bfh;

всего 14 байт.

Ожидал получить sizeof(bfh)=14.
А получилось sizeof(bfh)=16,
напоминает выравнивание.

Далее предполагалось

write(fd, bfh, sizeof(bfh)); //--- заголовок file.bmp (рисунок) ---

Не вышло. Нарушен формат файла.
Пришлось выкручиваться.

Почему не получаю ожидаемую структуру?

Кто знает прошу ответить.



> Язык СИ ОС UNIX > WORD, DWORD

Нет пути!

> Почему не получаю ожидаемую структуру?

Потому что выравнивание.

kemm ()

выровни

{

bla bla

}__attribute__((__packed__));

xscrew ★★ ()

вот в MSVC задача решается следующим образом

#pragma pack (2)

//codes

#pragma pack

вам выравнивание до 2х байт нужно выставить. по-умолчанию у вас срабатывает 4-байтное выравнивание.

gunja ()

ман сериализация. преобразует порядок байт в слове и убирает выравнивание, делает последовательность бит(байт). напрямую можно делать ио только с такими данными. даже инт уже нельзя напрямую писать.

anonymous ()
Ответ на: комментарий от gunja

#pragma pack(push, 2)
...
#pragma pack(pop)


работает и в msvc и в gcc

Reset ★★★★★ ()
Ответ на: комментарий от Reset

#pragma pack(push, 2)
...
#pragma pack(pop)

да.
Это работает.

Спасибо всем.

oleg_2 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.