繁体   English   中英

在任何平台上使用 ANSI C 保存和加载数据

[英]Save and load data using ANSI C on any platform

假设我有 100 万个结构,每个结构都包含整数、双精度、字符串和其他结构,例如:

struct s1 {
    int f1;
    long f2;
    char* f3;
};

struct s2 {
    struct s1* f1;
    double f2;
};

如何将这些以二进制格式保存到文件中,然后在不同于编译可执行文件的平台上从该文件中查找并加载它们,而不用担心字节顺序、浮点表示和其他特定于平台的问题?

首选二进制格式的原因主要是生成文件的大小。 如果仅整数看起来像“32435”并且我有数百万个整数,那么每个 integer 额外的 3 个字节将为文件增加相当多的大小。

将它们写为 ascii 文本、XML 或一些类似的非二进制格式。

“与编译可执行文件的平台不同的平台”

与编译可执行文件的版本有何不同? 您是否需要支持使用非 IEEE 浮点数的平台? 使用非 ASCII 字符的平台? 使用非 8 位字节的平台?

如果你坚持二进制,并且坚持自己做,可能你最好的办法是在存储格式中定义intlong将分别存储为 4 个字节的序列,小端(或大端,但无论平台如何,都选择一个并坚持使用它),每个字节恰好包含 8 个有效位。 double同样将是一个 IEEE double。 指针引入了整个世界,存储格式必须为s1的每个实例附加一个唯一标识符,然后可以将指向s1的指针存储为 id 值,并作为反序列化的一部分进行查找。

然后,不同的平台可以决定他们想为每种存储类型使用什么类型(例如,如果int在给定平台上只有 16 位,则它只需要对intlong类型都使用long 。因此,你应该给他们特定领域的假名)。 请注意,在与不兼容的表示之间进行转换时,不可能避免双精度值的精度损失,因为它们可能具有不同数量的有效位。

对于文本,非 ASCII 平台必须包含将自己的文本格式序列化为 ASCII 并将 ASCII 反序列化为原生文本的代码。 严格来说,您还应该避免在文本中使用任何不在 C 基本字符集中的字符,因为它们可能根本无法在目标上表示。 您可以做出类似的决定,是否愿意依靠目标平台以某种方式支持 Unicode - 如果是这样,那么 UTF-8 是一种合理的文本交换格式。

最后,对于每个平台上的每个结构,您可以:

  1. 编写(或者可能是自动生成)代码来序列化它,以及反序列化它的代码,或者:
  2. 让自己成为一种特定于领域的语言来定义结构,以及一个将根据该定义进行序列化和反序列化的解析器/解释器。

不过,对我来说,要做一些以前做过的事情,这听起来像是很多工作。

如果您想避免您所描述的令人头疼的问题,请不要使用二进制文件。 使用文本,通用* 格式。

*直到您开始进入语言环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM