从文件加载结构

时间:2018-07-03 11:24:23

标签: c++ struct binaryfiles endianness

我已经阅读了有关从文件加载结构的问题。字节序和可变大小不同存在问题。但是,让我们说有一个这样的结构:

struct Structure
{
    uint8_t value1;
    uint16_t value2;
    uint32_t value3;
    uint64_t value;4
};

让我们说文件总是以小尾数格式写入的,因此应用程序以严格的方式读取它。在这种情况下,字节序不应该引起任何问题。 (让我们假设有某种convertEndinness()函数足够聪明,可以忽略字节顺序问题)。我知道要考虑的第二件事是可变大小变量。这是我的问题。固定大小的类型是否可以解决此问题,为了创建多平台二进制文件,我还应该考虑什么?

1 个答案:

答案 0 :(得分:2)

  

固定大小类型是否可以解决此问题

不太。

固定大小类型具有固定大小,但是它们的alignment要求(以及填充)在平台和/或ABI风格之间可能有所不同。因此,即使具有相同的字节序,您的结构在不同的平台上仍可能具有不同的布局。

您可以坚持不应该进行填充,并使用某些特定于编译器的非标准方式来指定此填充(例如#pragma pack__attribute__((packed)))。但是,这可能会产生更差的代码,无法直接访问未对齐的成员。

  

要创建多平台二进制文件,我还应该考虑什么?

如果选择字节序,请使用固定大小的类型并正确指定对齐方式,就可以了。

我强烈建议添加标头和/或一些框架信息,以及有关您选择的尺寸和对齐方式的版本以及一些元数据。否则,将来您永远都无法更改此文件格式,除非事情以不愉快的方式中断。