簡體   English   中英

C++:如何以獨立於平台的方式讀寫多字節 integer 值?

[英]C++: How to read and write multi-byte integer values in a platform-independent way?

我正在開發一個簡單的協議,用於從/向緩沖區讀取/寫入 integer 值。 絕大多數整數都低於 128,但更大的值是可能的,所以我正在尋找某種形式的多字節編碼來以簡潔的方式存儲值。

以獨立於平台(即字節順序不可知)的方式讀取/寫入多字節值的最簡單和最快的方法是什么?

XDR格式可能會對您有所幫助。 如果非要用一句話來概括的話,那就是整數的一種二進制 UTF-8。

編輯:正如我在下面的評論中提到的,我“知道”XDR,因為我在辦公室工作中使用了幾個與 XDR 相關的功能。 只有在發表評論后,我才意識到我每天使用的“打包 XDR”格式甚至不是官方 XDR 文檔的一部分,所以我將單獨描述它。

因此,這個想法是:

  • 檢查字節的最高有效位。
    • 如果為 0,則該字節值。
    • 如果為 1,接下來的三位給出“字節數”,即值中的字節數。
      • 屏蔽頂部半字節(標志位加上字節數),連接適當數量的字節,你就得到了值。

我不知道這是一種“真實”的格式,還是我的(前)同事自己創建的(這就是我不發布代碼的原因)。

您可能對以下功能感興趣:

htonl, htons, ntohl, ntohs - 在主機和網絡字節順序之間轉換值

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

man byteorder

文本將是我的第一選擇。 如果你想要一個可變長度的二進制編碼,你有兩個基本的選擇:

  • 長度指示
  • 結束標記

您顯然將它們與一些值位合並。

  • 對於一個長度指示,它會給你一些長度和一些位一起給出的東西(參見例如 UTF-8),

  • 對於結束標記,您可以例如 state 設置的 MSB 指示最后一個字節,因此每個字節有 7 個數據位。

其他變體顯然是可能的。

您可以嘗試 網絡字節順序

Google 的協議緩沖區提供了使用可變寬度編碼的預制實現。

暫無
暫無

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

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