在位级别读取和写入值

时间:2018-10-05 14:30:49

标签: parsing bit bit-shift

嗨,我正在解析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             |
        |                             ....                              |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我发现这样的代码可以解析前三个值

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

0 个答案:

没有答案