包含用不同类型定义的位域的结构的大小
Size of a struct containing bitfields defined with different types
我有一个包含不同大小的位域的结构。有些位域只有 1 位,有些是 32 位宽。我将使用从串行通信接收到的缓冲区填充此结构。所以我计划在位域中定义它们,然后使用 memcpy
用接收到的数据包填充缓冲区。
这是我的结构定义:
#pragma pack(push,1)
typedef struct{
uint32_t variable1; //32 bit
uint16_t variable2:16; //16 bit
uint32_t variable3:18; //18 bit
uint32_t variable4:10; //10 bit
uint32_t variable5:4; //4 bit
uint8_t variable6; //8 bit
uint8_t variable7:7; //7 bit
uint8_t variable8:1; //1 bit
uint8_t variable9:6; //6 bit
uint8_t variable10:6; //6 bit
uint8_t variable11:7; //7 bit
uint8_t variable12:5; //5 bit
}error_driver_t; //Total length should be 15 bytes (120 bit)
#pragma pack(pop)
printf("\r\nSize of error_driver_t: %d\r\n\r\n", sizeof(demoErrorDriver)); //Expected 15, Resulted 20
串行数据包是 15 个字节,所以我希望这个结构也有 15 个字节长,以便正确使用 memcpy
。但是当我得到 sizeof(error_driver_t)
时,我得到 20。
当我在同一结构中同时拥有小型和大型类型时,我对如何使用位域感到困惑。
您无法确定一个结构的 sizeof
是否等于其中包含的变量大小的总和。这受到许多因素的影响,包括结构填充、您使用的 pragma 包、您使用的编译器,甚至您的变量在 struct
中的顺序,如 this answer to a similar question 中所述.
除此之外,C 标准还规定:
Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined)
所以你不能确定两个不同的变量是否会恰好占据它们位域的总和。
总而言之,最好的方法是使用多个位掩码 and/or 移位来从数据包中获取所需的值。
我有一个包含不同大小的位域的结构。有些位域只有 1 位,有些是 32 位宽。我将使用从串行通信接收到的缓冲区填充此结构。所以我计划在位域中定义它们,然后使用 memcpy
用接收到的数据包填充缓冲区。
这是我的结构定义:
#pragma pack(push,1)
typedef struct{
uint32_t variable1; //32 bit
uint16_t variable2:16; //16 bit
uint32_t variable3:18; //18 bit
uint32_t variable4:10; //10 bit
uint32_t variable5:4; //4 bit
uint8_t variable6; //8 bit
uint8_t variable7:7; //7 bit
uint8_t variable8:1; //1 bit
uint8_t variable9:6; //6 bit
uint8_t variable10:6; //6 bit
uint8_t variable11:7; //7 bit
uint8_t variable12:5; //5 bit
}error_driver_t; //Total length should be 15 bytes (120 bit)
#pragma pack(pop)
printf("\r\nSize of error_driver_t: %d\r\n\r\n", sizeof(demoErrorDriver)); //Expected 15, Resulted 20
串行数据包是 15 个字节,所以我希望这个结构也有 15 个字节长,以便正确使用 memcpy
。但是当我得到 sizeof(error_driver_t)
时,我得到 20。
当我在同一结构中同时拥有小型和大型类型时,我对如何使用位域感到困惑。
您无法确定一个结构的 sizeof
是否等于其中包含的变量大小的总和。这受到许多因素的影响,包括结构填充、您使用的 pragma 包、您使用的编译器,甚至您的变量在 struct
中的顺序,如 this answer to a similar question 中所述.
除此之外,C 标准还规定:
Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined)
所以你不能确定两个不同的变量是否会恰好占据它们位域的总和。
总而言之,最好的方法是使用多个位掩码 and/or 移位来从数据包中获取所需的值。