我用位字段定义了我的结构。
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 ++。
答案 0 :(得分:3)
您需要对字段进行分组,以便位域在一起:
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;
请注意,您在位域内不能有数组。
为什么你需要这个顺序的位?因为使用它的任何解决方案都会非常复杂。
答案 1 :(得分:0)
编译器可以用你的位字段做奇怪的事情。它基本上是一个"尽力而为"方法,没有标准的方法来影响它。根据我的经验,最好的事情是不使用位字段来实现" message-mapping"。声明要发送的字节,然后自己进行位操作(设置并获取所需的位)。
实际上,由于结构成员可能存在问题。大小,对齐和填充,以及字节排序(对于多字节数据)是完全安全的,也不要使用结构。自己打包并将消息解压缩到一个字节数组。只有在某些特定于应用程序的优化和一些检查(使用sizeof
和ofsetoff
技巧)中,您才应该使用结构进行消息映射。