Форум: "Прочее";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];
ВнизРасщепление байта на биты Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c