一、位域
参考:C++位域【简单记录】 - 知乎 (zhihu.com)
大概就是压缩数据量,你指定多少位存储就是多少位
二、问题的引出
要用12字节大小存储同步信源以及之前的怎么做?
V(2) P(1) X(1) CC(4) M(1) PT(7) 序列号 (16)
时戳 (32)
同步信源(32)
特约信源(32)
V 表示版本号,2 个 bit
P 表示填充位,1 个 bit。为 0 表示包尾部没有填充附加字节;为则表示有
X 表示扩展位,1 个 bit。为 1 表示包头后面还有一个扩展头部
CC 是 CSRC 个数,4bit。表示后面 CSRC 的个数 0~15 个
M 表示标记位,1 个 bit。给配置文档来用的
PT 表示荷载类型,7 个 bit。
序列号(SN),16 个 bit 时间戳,32 个 bit,记录数据荷载部分采样时刻
同步信源(SSRC)标识符,32 个 bit。标记 RTP 的来源,一个 RTP 会话中不能有两个 SSRC 值。
特约信源(CSRC)标识符,最多 15 个,每个都是 32 个 bit,一般不
三、结构体(类)定义
//默认值:
csrccount = 0;
extension = 0;
padding = 0;
version = 2;
pytype = 96;
mark = 0;
serial = 0;
timestamp = 0;
ssrc = 0x98765432;
class RTPHead {
public:
unsigned short csrccount : 4;
unsigned short extension : 1;
unsigned short padding : 1;
unsigned short version : 2; //这里是一个字节 上面的存储顺序为 version padding extension
unsigned short pytype : 7;
unsigned short mark : 1; //从这里,2个字节刚好是unsigned short的大小,刚好两个字节存储上面五个信息
unsigned short serial;
unsigned timestamp;
unsigned ssrc;
}; //sizeof(RTPHead) = 12
//那么在内存中表示 10 00 00 00 01 10 00 00
// 前两位10是version 最后七位(1100000是96)
// 00 00 00 00 00 00 00 00 (serial)
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00 (timestamp)
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00 (ssrc)
//把short去掉
class RTPHead {
public:
unsigned csrccount : 4;
unsigned extension : 1;
unsigned padding : 1;
unsigned version : 2; //这里是一个字节 上面的存储顺序为 version padding extension
unsigned pytype : 7;
unsigned mark : 1; //从这里,2个字节小于unsigned的大小,那么就会用两个字节存储上面五个信息,剩下两个字节 //为用0填充
unsigned short serial;
unsigned timestamp;
unsigned ssrc;
}; //sizeof(RTPHead) = 14
//那么在内存中表示 10 00 00 00 01 10 00 00
// 前两位10是version 最后七位(1100000是96)
// 00 00 00 00 00 00 00 00 (这一行是填充的,如果没有置0则随机)
// 00 00 00 00 00 00 00 00 (serial)
// 00 00 00 00 00 00 00 00 (timestamp)
// 00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00 (ssrc)
00 00 00 00 00 00 00 00
// 00 00 00 00 00 00 00 00 (ssrc)