C/C++ 结构,其中位字段打包在缓冲区中
C/C++ struct with bits fields packing in buffer
我已经用位字段定义了我的结构。
typedef struct{
unsigned char primero;
unsigned int bit1: 1;
unsigned int bit2: 1;
unsigned char segundo;
unsigned char array[4];
unsigned int offset: 6;
} date;
我想通过这个特定位的套接字发送这些数据。
char auxsendbuf[BUF_SIZ];
memset(sendbuf, 0, BUF_SIZ);
date *st = (date *) auxsendbuf;
st->primero = 0x01;
st->bit1 = 1;
st->bit2 = 1;
st->segundo = 0x03;
st->array[0] = 0x04;
st->array[1] = 0x05;
st->array[2] = 0x06;
st->array[3] = 0x07;
我的问题是 bit1 和 bit2 用 0 填充以完成我不想发送的额外字节。这是结果...
01 03 03 04 05 06 07 00 50
如何强制按顺序叮咬?如有必要,我可以使用C++。
您需要对字段进行分组,以便位字段在一起:
typedef struct{
unsigned char primero;
unsigned int bit1: 1;
unsigned int bit2: 1;
unsigned int offset: 6;
unsigned char segundo;
unsigned char array[4];
} date;
编辑:
如果您希望所有位都按原始顺序打包而不填充,则需要从介于两者之间的其他所有内容中制作位字段:
typedef struct{
unsigned char primero;
unsigned int bit1: 1;
unsigned int bit2: 1;
unsigned char segundo: 8;
unsigned char array0: 8;
unsigned char array1: 8;
unsigned char array2: 8;
unsigned char array3: 8;
unsigned int offset: 6;
} date;
请注意,位域内不能有数组。
为什么需要按此顺序排列的位? 因为任何使用它的解决方案都会非常复杂。
编译器
可以对你的位字段做一些奇怪的事情。这基本上是一种"尽力而为"的方法,没有标准的方式来影响它。根据我的经验,最好的办法是不要将位字段用于"消息映射"的目的。声明要发送的字节,然后自己执行位操作(设置和获取所需的位)。
实际上,由于结构成员的大小、对齐和填充以及字节排序(对于多字节数据)可能存在完全安全的问题,因此也不要使用结构。自己将消息打包和解压缩为字节数组。只有在某些特定于应用程序的优化和一些检查(使用sizeof
和ofsetoff
技巧)中,才应使用结构进行消息映射。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 协议缓冲区字符串字段的文本编码
- 浅拷贝到协议缓冲区的字节字段中
- 使用谷歌协议缓冲区 - 如何在.proto文件中定义字段
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- Google协议缓冲区-缺少必需的字段,即使所有字段都明显存在
- 在 C++ 中填充重复的自定义协议缓冲区字段
- 协议缓冲区(protobuf)v3.0.0-阿尔法-2中的可选字段和约束
- 谷歌协议缓冲区,如何设置自定义类型的字段
- C/C++ 结构,其中位字段打包在缓冲区中
- 在谷歌协议缓冲区中设置重复字段时出错
- 从C++访问协议缓冲区扩展重复字段
- 如何在协议缓冲区中设置嵌套消息的字段
- 访问协议缓冲区扩展字段
- 如何根据需要在google协议缓冲区中定义重复字段