我想直接在结构中插入,但没有一种方法可以正确避免填充问题
I want to memcpy directly into a struct, but none of the methods are avoiding the padding issue correctly
我正在尝试打开一个二进制文件并从中读取标头。我能够以一系列整数读取它,但我决定将其转换为结构以允许 n 个对象。但是,我每次都面临不同的问题,它们都是关于结构引入的填充。 当我尝试时
struct {
int x1;
int x2;
long long x3;
long long x4;
} info;
我遇到了一个问题,其中 x1 和 x2 后跟大小为 4 的填充。
当我尝试时
struct {
uint32 x1;
uint32 x2;
uint64 x3;
uint64 x4;
} info;
我遇到了一个问题,其中 sizeof(info( 返回的大小比第一个结构大得多。我想尝试编译指示包,但我想要一个不依赖于Visual Studio的通用Windows解决方案。 我知道正确排序声明以避免填充,但问题是顺序很重要,因为我正在使用memcpy(&info, bytes_array, sizeof(info))
读取二进制文件。
我想获得有关如何正确完成此操作的建议,即使这意味着我必须更改结构的外观。
我当前的代码:
unsigned int read_size = sizeof(info);
char* read_array = new char [read_size];
fin.read(read_array, read_size);
memcpy(&info, read_array, read_size);
结构的布局始终依赖于编译器,并且没有任何通用的方法来强制使用特定布局。 大多数编译器确实有某种pack
指令,无论是通过#pragma
还是__attribute__
或其他方式,但没有一种适用于所有编译器的方法。
如果你想要一个更独立于编译器的解决方案,那么不要复制到整个结构中;一次做一个成员:
unsigned int read_size = 24; // use explicit size, not sizeof(info)
char* read_array = new char [read_size];
fin.read(read_array, read_size);
info i;
memcpy(&i.x1, read_array, 4);
memcpy(&i.x2, read_array+4, 4);
memcpy(&i.x3, read_array+8, 8);
memcpy(&i.x4, read_array+16, 8);
请注意,编译器应该很好地优化这些memcpy()
。
您需要验证所使用的类型是否确实具有与二进制文件中的大小匹配的大小,并确保它们具有正确的字节顺序。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 寻找一种更好的方法来表示无符号字符数组
- 有没有一种通用的方法来实现不变量
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 一种从内存中删除 UTF 字节的方法?