加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

有没有办法控制C中的结构体之间的填充(包括位域)?

发布时间:2020-12-16 03:05:08 所属栏目:百科 来源:网络整理
导读:我正在解析网络数据流,我想知道是否有任何方法可以将数据流直接映射到数据结构. 例如,我想如下定义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; in
我正在解析网络数据流,我想知道是否有任何方法可以将数据流直接映射到数据结构.

例如,我想如下定义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标准没有说明关于这些位存储在位域中的顺序的任何内容 – 或者如果它们之间存在差距,那么这一点也是如此.尽管您可以期望根据字节顺序存储位字段(小端机首先以最低位开始,大端机首先以最高位开始),但在该方面,该标准不表示任何内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读