c++ - C/C++ 结构,在缓冲区中包含位字段

标签 c++ c sockets struct bit

我已经用位字段定义了我的结构。

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;

请注意,位域内不能有数组。

为什么你需要这个顺序的位?因为任何使用它的解决方案都会非常复杂。

关于c++ - C/C++ 结构,在缓冲区中包含位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348912/

相关文章:

断开连接后C STREAM客户端套接字重用

c++ - 我如何从 std::list.begin() 中强制一个非常量迭代器?

c++ - 在 C++ 中使用 sizeof() 遍历二维数组

c++ - 在 C++ 中处理指针

c - Eratosthenes 筛法 C 代码

java - 在同一连接中向 TCP 服务器发送多条消息

c++ - 静态类对象

c - 调整非特权帐户的 token (C、Windows)

c - 分配指针值

c - 如何从 getaddrinfo() 打印 IP 地址