Чтение и запись значений на битовом уровне - PullRequest
0 голосов
/ 05 октября 2018

Привет, я анализирую заголовки 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

...