3

我正在读取没有指针的简单二进制数据,使用 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 多种不同的类来涵盖所有可能出现的格式。我还读到其他选项包括使用位域、pragma 指令,甚至是 boost 序列化例程(我不能,因为我必须使用 std)。我的问题是:这是使用没有填充的类读取简单二进制数据的最佳方法吗?您是否建议任何其他替代方案?我想了解什么是最安全和最广泛使用的方法。

4

2 回答 2

2

通常,人们会使用 astruct而不是 a class,但是是的,相同的概念适用于两者。

于 2013-03-28T20:36:12.797 回答
1

我使用这些宏来允许打包结构在 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 已经定义了打包指令,但我不知道编译器是否支持它们。

于 2013-03-28T20:42:08.197 回答