为什么这个结构不是我期望的大小?
Why is this struct not the size I expect?
我正在将文件中的二进制输入输入到缓冲区向量,然后将该缓冲区的指针转换为我的结构类型。
目标是让数据完美地填充结构。
我知道所有不同字段的大小以及它们进入的顺序。
因此,我的结构需要紧密打包且长度为 42 字节。
我的问题是,当我测试它时,它的长度为 44 字节。
此外,第一个值排成一行。之后,数据不正确。
结构如下:
#pragma pack(push, 1)
struct myStruct
{
uint8_t ID;
uint32_t size: 24;
uint16_t value;
char name[12];
char description[4];
char shoppingList[14];
char otherValue[6];
};
#pragma pack(pop)
Also, the first value lines up. After that, the data is incorrect.
uint32_t size: 24;
如果您想可移植地保证这是在下一个成员之前没有填充的三个字节,您将需要使用字节缓冲区并自己进行转换.
#pragma pack
是一个扩展,位域成员的打包无论如何都是实现定义的。
FWIW GCC 和 CLANG do 似乎在这种情况下做你想做的事,但除非它是由依赖于此的平台 ABI 定义的,否则它仍然很脆弱。
我正在将文件中的二进制输入输入到缓冲区向量,然后将该缓冲区的指针转换为我的结构类型。
目标是让数据完美地填充结构。
我知道所有不同字段的大小以及它们进入的顺序。
因此,我的结构需要紧密打包且长度为 42 字节。 我的问题是,当我测试它时,它的长度为 44 字节。
此外,第一个值排成一行。之后,数据不正确。
结构如下:
#pragma pack(push, 1)
struct myStruct
{
uint8_t ID;
uint32_t size: 24;
uint16_t value;
char name[12];
char description[4];
char shoppingList[14];
char otherValue[6];
};
#pragma pack(pop)
Also, the first value lines up. After that, the data is incorrect.
uint32_t size: 24;
如果您想可移植地保证这是在下一个成员之前没有填充的三个字节,您将需要使用字节缓冲区并自己进行转换.
#pragma pack
是一个扩展,位域成员的打包无论如何都是实现定义的。
FWIW GCC 和 CLANG do 似乎在这种情况下做你想做的事,但除非它是由依赖于此的平台 ABI 定义的,否则它仍然很脆弱。