从文件加载结构
Loading struct from file
我已阅读有关从文件加载结构的问题。字节序和不同的变量大小存在问题。但是让我们说有这样一个结构:
struct Structure
{
uint8_t value1;
uint16_t value2;
uint32_t value3;
uint64_t value;4
};
假设文件始终以小端格式写入,因此应用程序以严格的方式读取它。在这种情况下,字节序不会造成任何问题。 (让我们假设有某种足够聪明的 convertEndinness() 函数可以忽略字节顺序问题)。我知道需要考虑的第二件事是可变大小的多样性。这是我的问题。固定大小的类型是否能够解决这个问题?为了创建多平台二进制文件我还应该考虑什么?
Do fixed size types manage to handle this problem
不完全是。
fixed-size 类型具有固定大小,但它们的 alignment 要求(因此填充)可能因平台 and/or ABI 风格而异。因此,即使具有相同的字节顺序,您的结构在不同平台上仍可能具有不同的布局。
你可以坚持不应该有填充,并使用一些 compiler-specific 和 non-standard 的方式来指定它(比如 #pragma pack
或 __attribute__((packed))
)。但是,这可能会产生更糟糕的代码来直接访问未对齐的成员。
what else should I consider in order to create multiplatform binary file?
如果您选择字节序,使用 fixed-size 类型并正确指定对齐方式,您可能没问题。
我强烈建议添加 header and/or 一些框架信息,以及版本和可能的一些关于您选择的大小和对齐方式的元数据。否则,您以后永远无法更改此文件格式,而不会以令人不愉快的方式出现问题。
我已阅读有关从文件加载结构的问题。字节序和不同的变量大小存在问题。但是让我们说有这样一个结构:
struct Structure
{
uint8_t value1;
uint16_t value2;
uint32_t value3;
uint64_t value;4
};
假设文件始终以小端格式写入,因此应用程序以严格的方式读取它。在这种情况下,字节序不会造成任何问题。 (让我们假设有某种足够聪明的 convertEndinness() 函数可以忽略字节顺序问题)。我知道需要考虑的第二件事是可变大小的多样性。这是我的问题。固定大小的类型是否能够解决这个问题?为了创建多平台二进制文件我还应该考虑什么?
Do fixed size types manage to handle this problem
不完全是。
fixed-size 类型具有固定大小,但它们的 alignment 要求(因此填充)可能因平台 and/or ABI 风格而异。因此,即使具有相同的字节顺序,您的结构在不同平台上仍可能具有不同的布局。
你可以坚持不应该有填充,并使用一些 compiler-specific 和 non-standard 的方式来指定它(比如 #pragma pack
或 __attribute__((packed))
)。但是,这可能会产生更糟糕的代码来直接访问未对齐的成员。
what else should I consider in order to create multiplatform binary file?
如果您选择字节序,使用 fixed-size 类型并正确指定对齐方式,您可能没问题。
我强烈建议添加 header and/or 一些框架信息,以及版本和可能的一些关于您选择的大小和对齐方式的元数据。否则,您以后永远无法更改此文件格式,而不会以令人不愉快的方式出现问题。