Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;在缓冲区中填充位字段的结构_C++_C_Sockets_Struct_Bit - Fatal编程技术网

C++ C/C++;在缓冲区中填充位字段的结构

C++ C/C++;在缓冲区中填充位字段的结构,c++,c,sockets,struct,bit,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]; mem

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

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;
我的问题是,位1和位2用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;
请注意,位字段中不能有数组


你为什么要按这种顺序排列呢?因为任何使用它的解决方案都会非常复杂。

您需要将字段分组,以便将位字段放在一起:

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
of setoff
技巧),才应该使用结构进行消息映射。

编译器可以对位字段执行奇怪的操作。这基本上是一种“尽力而为”的方法,没有标准的方法来影响它。根据我的经验,最好不要为了“消息映射”而使用位字段。声明要发送的字节,然后自己执行位操作(设置和获取所需的位)


实际上,由于结构成员的大小、对齐和填充以及字节顺序(对于多字节数据)可能会出现问题,因此也不要使用结构。自己将消息打包并解压缩到字节数组中。只有在一些特定于应用程序的优化和一些检查中(使用
sizeof
of setoff
技巧),您才应该使用结构进行消息映射。

这只是我不想做的。我显然也得到了同样的结果。我想将第1位和第2位与字段segundo的6位合并。我想把偏移量放在数据包的最后一部分。@XabiE要完成这一点,您必须在位级别用位移位和掩蔽来序列化数据包。这只是我不想做的。我显然也得到了同样的结果。我想将第1位和第2位与字段segundo的6位合并。我想将偏移量放在数据包的最后一部分。@XabiE要完成这一点,您必须在位级别使用位移位和掩蔽对数据包进行序列化。通过线路发送的标识编码内容(带有位字段!)会带来麻烦。通过线路发送的标识编码内容(带有位字段!)他在自找麻烦。