簡體   English   中英

以平台無關的方式將值序列化為字節字符串

[英]Serializing values to a string of bytes in a platform-independent way

我正在編寫一些序列化代碼,這些代碼將在比以前更低的級別上工作。 我需要使用各種值類型( int32_tint64_tfloat等)的函數,並將它們推到vector<unsigned char>以准備寫入文件。 該文件將以類似的方式讀取和重構。

寫入向量的函數如下所示:

void write_int32(std::vector<unsigned char>& buffer, int32_t value)
{
    buffer.push_back((value >> 24) & 0xff);
    buffer.push_back((value >> 16) & 0xff);
    buffer.push_back((value >> 8) & 0xff);
    buffer.push_back(value & 0xff);
}

void write_float(std::vector<unsigned char>& buffer, float value)
{
    assert(sizeof(float) == sizeof(int32_t));

    write_int32(buffer, *(int32_t *)&value);
}

在我到目前為止使用的單台機器上,這些有點移位,易於處理的暴行似乎可以正常工作,但它們卻非常脆弱。 在哪里可以了解到哪些操作可以保證在體系結構,浮點表示等方面產生相同的結果? 具體來說,是否有更安全的方法來完成我在這兩個示例函數中所做的工作?

可讀的表示法是最安全的。 帶有xsd的XML是一種選項,可以允許您精確地指定值和格式。

如果您真的想要二進制表示形式,請查看hton*ntoh*函數:

http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

通常,最好的方法是使用為此目的而設計的外部庫-引入平台不一致錯誤很容易,尤其是在嘗試傳輸浮點類型之類的信息時。 開源軟件有多個選項可以做到這一點。 一個示例是Google Protocol Buffers ,它除了與平台無關外,還具有與語言無關的優點(它根據您定義的消息生成用於序列化的代碼)。

我想要快速,輕便的東西,所以我提出了一種簡單而愚蠢的文本序列化格式。 每個值都使用幾乎沒有什么復雜的東西寫入文件

output_buffer << value << ' ';

Protocol Buffers可以正常工作,但我擔心它們需要太長時間才能集成。 XML的冗長性對我來說將是一個問題-我需要序列化數千個值,甚至用<a>...</a>包裝每個數字都會為每個文件增加近兆字節。 我嘗試了MessagePack,但它似乎與C ++的靜態類型有點尷尬。 我想出的不是很聰明,但是效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM