The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Perl,pack - выравнивание на границу слова"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Perl,pack - выравнивание на границу слова"  
Сообщение от Raist (??) on 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 заставить самому делать выравнивание на по границе ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Perl,pack - выравнивание на границу слова"  
Сообщение от BigHo on 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) функции, специально для этого предназначенные.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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