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
()

guint32 nrows __attribute__ ((packed));

ip1981 ☆☆
()
Ответ на: комментарий от m0rph

да.
Имелось в виду
write(fd, &bfh, sizeof(bfh));

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

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

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

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

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