c++ - 为什么这个结构不是我期望的大小?
问题描述
我从文件中获取二进制输入到缓冲区向量,然后将该缓冲区的指针转换为我的结构类型。
目标是让数据完美地填充结构。
我知道所有不同字段的大小以及它们进入的顺序。
因此,我的结构需要紧密包装并且长度为 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)
解决方案
此外,第一个值排列。之后,数据不正确。
uint32_t size: 24;
如果您想保证在下一个成员之前这是三个字节且没有填充,那么您将需要使用字节缓冲区并自己进行转换。
#pragma pack
是一个扩展,位域成员的打包无论如何都是实现定义的。
在这种情况下, GCC 和 CLANG 的 FWIW似乎都可以做你想做的事情,但除非它是由平台 ABI 定义的,否则它仍然很脆弱。
推荐阅读
- python-3.6 - 如何从熊猫数据框中删除基线?
- c# - Hibernate 是否将“0”值更改为“NULL”?
- spring - 我使用 resttemplate 来测试我的 Web 服务,但是当我运行测试时,我与应用程序的连接出现错误
- c++ - 为什么这会更新到矢量中的地图
- php - 如何使用路由过滤器检查 Laravel 5.8 中登录用户的角色
- modal-dialog - 为什么使用自定义操作栏未触发显示模式/显示模式事件?
- php - 制作了一个随机名称生成器:如何使首字母大写或小写随机化?
- linux - 如何从后台进程重定向日志
- node.js - API网关和微服务通信
- javascript - 如何在javascript中从旧对象制作新对象?