![](/img/trans.png)
[英]C++: How to read and write multi-byte integer values in a platform-independent way?
[英]Serializing values to a string of bytes in a platform-independent way
我正在編寫一些序列化代碼,這些代碼將在比以前更低的級別上工作。 我需要使用各種值類型( int32_t
, int64_t
, float
等)的函數,並將它們推到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.