The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, 19:22 , 26-Дек-06 (1)

    >или же в обьявлении струкутуры в Си явно отменить для нее выравнивание
    >(есть там у 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) функции, специально для этого предназначенные.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру