簡體   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