我正在解析网络数据流,我想知道是否有任何方法可以将数据流直接映射到数据结构.
例如,我想如下定义RTP协议的数据结构.
class RTPHeader { int version:2; // The first two bits is version. int P:1; // The next bits is an field P. int X:1; int CC:4; int M:1; int PT:7; int sequenceNumber; int64 timestamp; ..... };
并以这种方式使用它.
RTPHeader header; memcpy(&header,steamData,sizeof(header));
但是,由于C编译器将在成员之间插入填充,是否有任何方法来控制,以便在成员之间不添加填充(包括位字段成员)?
这个问题不是How to get rid of padding bytes between data members of a struct的重复,因为我的例子中可能有位字段.
解决方法
只要你不要求这个代码在任意机器上“工作” – 例如.对于int位于什么字节边界(通常为4字节边界),然后使用有限制的机器
#pragma(pack)
应该是工作,它是supported in GCC以及微软和“微软插件兼容”编译器(如英特尔的编译器).
但请注意,所有处理器不支持未对齐的访问,因此启动具有16位值的块,后跟32位int可能会导致问题.
我还将使用一个大小的整数作为序列号,以确保它在每个编译器中是32位,而不是突然的16位或64位.
还要注意的是,C标准没有说明关于这些位存储在位域中的顺序的任何内容 – 或者如果它们之间存在差距,那么这一点也是如此.尽管您可以期望根据字节顺序存储位字段(小端机首先以最低位开始,大端机首先以最高位开始),但在该方面,该标准不表示任何内容.