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