问题描述
|
假设我有100万个结构,每个结构都包含整数,双精度型,字符串和其他结构,例如:
struct s1 {
int f1;
long f2;
char* f3;
};
struct s2 {
struct s1* f1;
double f2;
};
如何将它们保存为二进制格式的文件,然后在与可执行文件编译所在的平台不同的平台上查找并从该文件加载它们,而不必担心字节序,浮点表示和其他特定于平台的陷阱?
选择二进制格式的原因主要是结果文件的大小。如果仅整数看起来就像\“ 32435 \”,而我有数百万个整数,则每个整数额外的3个字节会增加文件的大小。
解决方法
\“平台与可执行文件的编译平台不同\”
与可执行文件的编译有何不同?您需要支持使用非IEEE浮动的平台吗?使用非ASCII字符的平台?使用非8位字节的平台?
如果您坚持使用二进制文件,并且自己坚持要这样做,那么最好的选择是定义存储格式中的
int
和long
分别以4个字节的顺序存储,即低端(或大端),但是不论平台如何,都选择一个并坚持下去),每个字节恰好包含8个有效位。 “ 3”将同样是IEEE的两倍。指针引入了一个痛苦的世界,存储格式必须为每个s1
实例附加一个唯一的标识符,然后可以将指向s1
的指针存储为id值,并作为反序列化的一部分进行查找。
然后,不同的平台可以决定要为每种存储类型使用哪种类型(例如,如果给定平台上的int
只有16位,则int
和long
类型都必须使用long
。因此, ,则应为他们指定域专用的假名)。请注意,在与不兼容的表示形式之间进行转换时,要避免双精度值的精度损失是不可能的,因为它们可能没有相同数量的有效位。
对于文本,非ASCII平台将必须包含代码以将其自身的文本格式序列化为ASCII,并将ASCII反序列化为本地文本。严格来说,您还应该避免使用文本中不属于C基本字符集的任何字符,因为这些字符在目标上可能根本无法表示。您可以做出类似的决定,是否愿意以某种方式依靠目标平台支持Unicode -如果是这样,那么UTF-8是一种合理的文本交换格式。
最后,对于每个平台上的每个结构,您可以:
编写(或自动生成)代码以对其进行序列化,并对其进行反序列化,或者:
使自己成为特定于域的语言来定义结构,并使解析器/解释器根据该定义进行序列化和反序列化。
不过,听起来对我来说,要做一些以前已经完成的工作非常繁琐。
, 将它们编写为ascii文本,XML或一些类似的非二进制格式。
, 如果您想避免上述麻烦,请不要使用二进制文件。使用文本,即Universal *格式。
*直到您开始进入语言环境。