URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6044
[ Назад ]

Исходное сообщение
"Perl,pack - выравнивание на границу слова"

Отправлено Raist , 26-Дек-06 18:03 
Добрый день!
Возник такой вопрос, Существует структура данных в Си,например вида
struct data
{
unsigned char a;
unsigned char b;
unsigned int c;
}

Вообще в сумме это 6 байт,но gcc делает выравнивание и получаем 8;
В перле
pack("C2I",0x00,0x00,0x00);
Перл никакого выравнивания не делает, в результате 6. Но потом если эту струкутур засунуть в сокет, и передать на обработку Си приложению, оно матюкнется, мол длина не совпалает.
Вопрос что делать? описать структуру в перле как
pack("C2IC2",бла бла бла);
или же в обьявлении струкутуры в Си явно отменить для нее выравнивание (есть там у gcc такая директива) но не один вариант не нравится....не красиов как то :) Может можно pack заставить самому делать выравнивание на по границе ?


Содержание

Сообщения в этом обсуждении
"Perl,pack - выравнивание на границу слова"
Отправлено BigHo , 26-Дек-06 19:22 

>или же в обьявлении струкутуры в Си явно отменить для нее выравнивание
>(есть там у gcc такая директива)

struct data
{
unsigned char a;
unsigned char b;
unsigned int c;
} __attribute__((packed));

>но не один вариант не
>нравится....не красиов как то :)

очень даже красиво. Иначе, если будешь искать идеал, то скоро будешь работать с битовыми цепочками, а не байтами :)

>Может можно pack заставить самому делать
>выравнивание на по границе ?

А почему бы не манипулировать значениями unsigned int вместо unsigned char. Кто не хочет заморачиваться с выравниванием, именно так и поступает.

Кроме этой у сетевых приложений есть проблемы с big-endian и little-endian. Чтобы сильно не утомляться, можно использовать XDR(3) функции, специально для этого предназначенные.