我想 memcpy 直接进入一个结构,但是 none 的方法正确地避免了填充问题
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) 返回的大小比第一个结构大得多的问题。我想尝试 pragma pack,但我想要一个不依赖于 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()
。
您需要验证您使用的类型的大小是否与二进制文件中的大小相匹配,并确保它们具有正确的字节顺序。
我正在尝试打开一个二进制文件并从中读取文件头。我能够以一系列整数读取它,但我决定将它转换成一个结构以允许 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) 返回的大小比第一个结构大得多的问题。我想尝试 pragma pack,但我想要一个不依赖于 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()
。
您需要验证您使用的类型的大小是否与二进制文件中的大小相匹配,并确保它们具有正确的字节顺序。