首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在任何平台上使用ANSI C保存和加载数据

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

Stack Overflow用户
提问于 2011-06-12 01:31:17
回答 3查看 671关注 0票数 1

假设我有一百万个结构,每个结构包含整数、双精度、字符串和其他结构,如下所示:

代码语言:javascript
复制
struct s1 {
    int f1;
    long f2;
    char* f3;
};

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

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

首选二进制格式的原因主要是结果文件的大小。如果整型数看起来像"32435“,而我有数百万个整型数,那么每个整型数额外的3个字节将会给文件增加相当多的大小。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-12 02:11:23

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

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

如果您坚持使用二进制,并且坚持自己使用二进制,那么您最好的选择就是在存储格式中定义,intlong将分别存储为一个4字节的序列,即小端(或大端,但选择一个字节并坚持使用它,而不考虑平台),每个字节恰好包含8个有效位。同样,double也将是IEEE的翻版。指针引入了一个完整的伤害世界,存储格式必须为每个s1实例附加一个惟一的标识符,然后指向s1的指针可以存储为id值,并作为反序列化的一部分进行查找。

然后,不同的平台可以决定要为每种存储类型使用什么类型(例如,如果给定平台上的int只有16位,则只需对intlong类型使用long即可。因此,您应该为它们提供特定于域的假名)。注意,在转换为不兼容的表示和从不兼容的表示中转换时,不可能避免双精度值的精度损失,因为它们可能具有不同数量的有效位。

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

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

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

不过,对于我来说,要做一些以前做过的事情,似乎有很多工作要做。

票数 2
EN

Stack Overflow用户

发布于 2011-06-12 01:37:07

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

票数 3
EN

Stack Overflow用户

发布于 2011-06-12 01:42:12

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

*直到您开始进入区域设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6317462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档