我正在使用C++类读取没有指针的简单二进制数据,而没有填充以下代码:

#include <fstream>
#include <iostream>

using namespace std;

class Data {
    public:
    int a;
    int b;
    short int c;
    double d;
}__attribute__((packed));

int main() {
    Data myData;
    ifstream ifs("test.bin", ios::binary);
    ifs.read((char *)&myData, sizeof(myData));
    ifs.close();
}

我使用这种方法是因为数据可能具有20多种不同的格式,并且我想编写20多种不同的类来覆盖可能出现的所有格式。我还阅读了其他选项,包括使用位域,编译指示,甚至Boost序列化例程(我不能,因为我必须使用std)。我的问题是:这是使用类而不填充的读取简单二进制数据的最佳方法吗?您是否建议其他选择? 我想了解什么是最安全,使用最广泛的方法。

最佳答案

我使用这些宏来允许打包的结构在gcc和VC上进行编译:

#ifdef _MSC_VER
    #define BEGIN_PACK __pragma( pack(push, 1) )
    #define END_PACK __pragma( pack(pop) )
#else
    #define BEGIN_PACK
    #define END_PACK __attribute__((packed))
#endif

因此,您可以像这样使用它们:
BEGIN_PACK
struct Data {
    int a;
    int b;
    short int c;
    double d;
} END_PACK;

但是,是的,通常就是这样。请注意,这些是非标准扩展。

C++ 11定义了打包指令,但是我不知道编译器是否支持它们。

关于c++ - 使用类无需填充即可在C++中读取二进制数据的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15691605/

10-11 16:04
查看更多