Привет, я анализирую заголовки RTP и не понимаю, как работает чтение и запись битов.
Если у меня есть такой заголовок
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Я нашел код, которыйанализирует первые 3 значения следующим образом:
hdr->ver = (buf[0] >> 6) & 0x03;
hdr->pad = (buf[0] >> 5) & 0x01;
hdr->ext = (buf[0] >> 4) & 0x01;
hdr->cc = (buf[0] >> 0) & 0x0f;
hdr->m = (buf[1] >> 7) & 0x01;
hdr->pt = (buf[1] >> 0) & 0x7f;
Я понимаю, что сдвиг вправо делает то, что я не понимаю, это то, что делает поразрядно и делает и почему значения (3, 1, 1, 31,1 и 127).
И почему при обратной записи значение отличается (см. Версию)?
buf[0] = (hdr->ver & 0x02) << 6;
buf[0] |= (hdr->pad & 0x01) << 5;
buf[0] |= (hdr->ext & 0x01) << 4;
buf[0] |= (hdr->cc & 0x0f) << 0;
buf[1] = (hdr->m & 0x01) << 7;
buf[1] |= (hdr->pt & 0x7f) << 0;
Может кто-нибудь объяснить это простыми словами?
С уважением, Teamol