The OpenNET Project / Index page

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

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

"Битовый поток"  
Сообщение от register email(ok) on 03-Июл-06, 13:21 
Уважаемые коллеги. Хочу спросить вашего совета.

Есть задача. Прочитать из файла сообщение определенного формата и разобрать его
по полям. Однако, поля не выровнены по границам байтов. Связано это с тем, что
сообщения идут в протоколе HDLC, а там бит-стаффинг, служебные биты и т.д.

Вопрос: Есть ли какие-либо типовые приемы обработки таких потоков?
Разбирать байты на биты на лету или сначала в буфер скидывать? Как это вообще
по хорошему делается?  

Заранее спасибо за ответ(ы)...

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

 Оглавление

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


1. "Битовый поток"  
Сообщение от chip email(ok) on 03-Июл-06, 17:16 
>Уважаемые коллеги. Хочу спросить вашего совета.
>
>Есть задача. Прочитать из файла сообщение определенного формата и разобрать его
>по полям. Однако, поля не выровнены по границам байтов. Связано это с
>тем, что
>сообщения идут в протоколе HDLC, а там бит-стаффинг, служебные биты и т.д.

В этом случае обратить внимание на директиву gcc __packed__. info gcc. Вероятнее всего, можно более красиво решить через union'ы.

>Вопрос: Есть ли какие-либо типовые приемы обработки таких потоков?
>Разбирать байты на биты на лету или сначала в буфер скидывать? Как
>это вообще
>по хорошему делается?

Посмотреть в сторону tcpdump. ИМХО, задача абсолютно аналогичная. Наиболее оптимальным вариантом, будет агрегация некоторого потока информации с последующим его сбросом на диск.  Интервал сброса зависит от скорости поступления и самого потока.

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

2. "Битовый поток"  
Сообщение от vic (??) on 03-Июл-06, 18:53 
>>Уважаемые коллеги. Хочу спросить вашего совета.
>>
>>Есть задача. Прочитать из файла сообщение определенного формата и разобрать его
>>по полям. Однако, поля не выровнены по границам байтов. Связано это с
>>тем, что
>>сообщения идут в протоколе HDLC, а там бит-стаффинг, служебные биты и т.д.
>
>В этом случае обратить внимание на директиву gcc __packed__. info gcc. Вероятнее
>всего, можно более красиво решить через union'ы.

union также выравниваются по границе.
__packed__ - не работает для других компиляторов (увы).
Я делал так (случай единого кода под разные компиляторы на разных ОС):
#pragma pack(1)
struct {
    u_int8 header;
    u_int16 lenght;
} data;
#pragma pack(4)

Для новых компиляторов (например gcc 3.x и выше) лучше pack(1,push) и pack(pop) (если не забыл синтаксис)

Совет: Окружайте прагмой конкретные структуры, а не весь h-файл. А то я однажды запихал в прагмы заодно и класс с виртуальными функциями.. так весело было....

Стаффинг у меня на лету разбирался.

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

3. "Битовый поток"  
Сообщение от chip email(ok) on 04-Июл-06, 01:22 
>>>Уважаемые коллеги. Хочу спросить вашего совета.
>>>
>>>Есть задача. Прочитать из файла сообщение определенного формата и разобрать его
>>>по полям. Однако, поля не выровнены по границам байтов. Связано это с
>>>тем, что
>>>сообщения идут в протоколе HDLC, а там бит-стаффинг, служебные биты и т.д.
>>
>>В этом случае обратить внимание на директиву gcc __packed__. info gcc. Вероятнее
>>всего, можно более красиво решить через union'ы.
>
>union также выравниваются по границе.
>__packed__ - не работает для других компиляторов (увы).
>Я делал так (случай единого кода под разные компиляторы на разных ОС):
>
>#pragma pack(1)
>struct {
>    u_int8 header;
>    u_int16 lenght;
>} data;
>#pragma pack(4)

struct data {
    u_int8 header;
    u_int16 length;
} __attribute__((packed));

>
>Для новых компиляторов (например gcc 3.x и выше) лучше pack(1,push) и pack(pop)
>(если не забыл синтаксис)

Лучше как раз для каждой структуры указывать __attribute__((packed))

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

4. "Битовый поток"  
Сообщение от vic (??) on 04-Июл-06, 11:58 
>>>>Уважаемые коллеги. Хочу спросить вашего совета.
>>>>
>>>>Есть задача. Прочитать из файла сообщение определенного формата и разобрать его
>>>>по полям. Однако, поля не выровнены по границам байтов. Связано это с
>>>>тем, что
>>>>сообщения идут в протоколе HDLC, а там бит-стаффинг, служебные биты и т.д.
>>>
>>>В этом случае обратить внимание на директиву gcc __packed__. info gcc. Вероятнее
>>>всего, можно более красиво решить через union'ы.
>>
>>union также выравниваются по границе.
>>__packed__ - не работает для других компиляторов (увы).
>>Я делал так (случай единого кода под разные компиляторы на разных ОС):
>>
>>#pragma pack(1)
>>struct {
>>    u_int8 header;
>>    u_int16 lenght;
>>} data;
>>#pragma pack(4)
>
>struct data {
>    u_int8 header;
>    u_int16 length;
>} __attribute__((packed));
>
>>
>>Для новых компиляторов (например gcc 3.x и выше) лучше pack(1,push) и pack(pop)
>>(если не забыл синтаксис)
>
>Лучше как раз для каждой структуры указывать __attribute__((packed))

Да я обеими лапами за.
Вот только эта конструкция только для gcc.

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

5. "Битовый поток"  
Сообщение от register email(ok) on 06-Июл-06, 09:43 
Дестафинг сделал на лету, а далее все выравнивается на байты.
Tcpdump почитал. Вещь полезная.
Спасибо за участие...
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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




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

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