首页 > 解决方案 > 为什么这个结构不是我期望的大小?

问题描述

我从文件中获取二进制输入到缓冲区向量,然后将该缓冲区的指针转换为我的结构类型。

目标是让数据完美地填充结构。

我知道所有不同字段的大小以及它们进入的顺序。

因此,我的结构需要紧密包装并且长度为 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)

标签: c++structpacking

解决方案


此外,第一个值排列。之后,数据不正确。

uint32_t size: 24;

如果您想保证在下一个成员之前这是三个字节且没有填充,那么您将需要使用字节缓冲区并自己进行转换。

#pragma pack是一个扩展,位域成员的打包无论如何都是实现定义的。

在这种情况下, GCC 和 CLANG 的 FWIW似乎都可以你想做的事情,但除非它是由平台 ABI 定义的,否则它仍然很脆弱。


推荐阅读