Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.20;
Скачать: CL | DM;

Вниз

Расщепление байта на биты   Найти похожие ветки 

 
DVM ©   (2009-07-21 23:33) [0]

Подскажите, пожалуйста, что то никак не соображу, все ли верно я делаю.
Итак, есть структура с битовыми полями, описанная в С  как:

 struct RtpDataHeader
 {
   // Ver
   U8 cc:4;         // CSRC count
   U8 x:1;          // header extension flag
   U8 p:1;          // padding flag
   U8 version:2;    // protocol version

   // Payload
   U8 pt:7;         // payload type
   U8 m:1;          // marker bit

   U16 seqN;        // sequence number, network order
   U32 timestampN;  // timestamp, network order
   U32 ssrcN;       // synchronization source, network order
   U32 csrc[];      // optional CSRC list
 };


В паскале это дело превращается в такое:


 TRtpDataHeader = record
   Ver: Byte;
   Payload: Byte;
   Sequence: Word;
   Timestamp: DWord;
   SSRC: DWord;
   CSRC: PDWord;
 end;
 PRtpDataHeader = ^TRtpDataHeader;


Допустим у меня есть:
var
 Packet: TRtpDataHeader;

И я хочу поместить значение поля "protocol version" в переменную pv: byte;

Это так будет выглядеть:

pv := Packet.Ver shr 6

Все верно? С порядком бит ничего я не напутал?


 
Сергей М. ©   (2009-07-21 23:39) [1]

Вроде бы да ..
А что, есть сомнения ?


 
DVM ©   (2009-07-21 23:44) [2]


> Сергей М. ©


> А что, есть сомнения ?

Честно говоря есть небольшие, поэтому решил уточнить на всякий случай.


 
Сергей М. ©   (2009-07-21 23:53) [3]


> DVM ©   (21.07.09 23:44) [2]


Ну судя по сишной декларации 2-хбитовое поле версии находится в битах 6..7

После логического сдвига вправо на 6 бит они как раз окажутся в битах 0..1 результата..


 
Псалтырь ©   (2009-07-21 23:54) [4]

packed record?


 
Сергей М. ©   (2009-07-21 23:57) [5]


> Псалтырь ©   (21.07.09 23:54) [4]


Фиолетово.

Поле версии - младшее в порядке объявления полей в структуре.


 
Игорь Шевченко ©   (2009-07-21 23:57) [6]


>    SSRC: DWord;
>    CSRC: PDWord;
>  end;
>  PRtpDataHeader = ^TRtpDataHeader;


CSRC: array[0..0] of DWORD


 
KilkennyCat ©   (2009-07-21 23:58) [7]

ну и как здесь повлияет packed? ужмет до бита? :D


 
Игорь Шевченко ©   (2009-07-21 23:58) [8]


> Честно говоря есть небольшие, поэтому решил уточнить на
> всякий случай.


так практика - критерий истины. Всяко надежней, чем в форуме спрашивать :)


 
Сергей М. ©   (2009-07-21 23:59) [9]


> CSRC: array[0..0] of DWORD


Кстати, довольно важное замечание


 
Игорь Шевченко ©   (2009-07-22 00:00) [10]

кстати, packed я бы сделал. Все записи, принимаемые извне лучше объявлять packed, если гарантировано не известно обратное.


 
Сергей М. ©   (2009-07-22 00:01) [11]


> packed я бы сделал


Кстати, я бы тоже.


 
DVM ©   (2009-07-22 00:01) [12]


> Игорь Шевченко ©   (21.07.09 23:57) [6]


> CSRC: array[0..0] of DWORD

Да, так правильнее, спасибо.


> так практика - критерий истины. Всяко надежней, чем в форуме
> спрашивать :)

Это само собой, просто то того момента как я смогу проверить данный кусок в работе, т.е. принять пакет RTP и посмотреть содержимое мне еще пилить и пилить.


 
Сергей М. ©   (2009-07-22 00:03) [13]


> мне еще пилить и пилить


Пилите, Дмитрий, пилите - он золотой)


 
KilkennyCat ©   (2009-07-22 00:05) [14]


> packed я бы сделал

а я бы не торопился. мало данных.
насколько я помню, это влияет на время доступа, да и параметры компилятора тоже вроде как, учитывать надо, по выравниванию.


 
DVM ©   (2009-07-22 00:12) [15]

В данной записи не играет роли packed она или нет.


 
Игорь Шевченко ©   (2009-07-22 00:15) [16]

KilkennyCat ©   (22.07.09 00:05) [14]

Это может влиять на время доступа, если структура записи разрабатывается для обмена и все стороны используют одно и то же значение выравнивания, а если структура жестко задана извне, то кроме packed ничего не поиспользуешь.



Страницы: 1 вся ветка

Текущий архив: 2009.09.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
4-1217761801
kalexi
2008-08-03 15:10
2009.09.20
Как рисовать в статике используя двойную буферизацию?


15-1248125402
Юрий
2009-07-21 01:30
2009.09.20
С днем рождения ! 21 июля 2009 вторник


15-1248340620
РВА
2009-07-23 13:17
2009.09.20
Удаленное подключение к ПК и к базе.. как?


2-1247727729
12
2009-07-16 11:02
2009.09.20
Какая разница кто? MyControl:=tControl.Create(кто-то);


2-1247632669
wiser87
2009-07-15 08:37
2009.09.20
Поведение TEdit на модальной форме.