首頁  >  文章  >  後端開發  >  如何用 C 語言實作可移植的 64 位元整數位元組排序函數?

如何用 C 語言實作可移植的 64 位元整數位元組排序函數?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-01 01:33:28327瀏覽

How to Implement a Portable 64-Bit Integer Byte Ordering Function in C  ?

C 語言中的可移植64 位元整數位元組排序函數

問題:

我們能否得到像htonl 這樣的標準函數在C 中使用64 位元整數,允許轉換為網路位元組順序?

答案:

雖然 C 中沒有像 htonll 這樣明確定義的函數標準函式庫,可以建立可移植的實作。這裡有兩種方法:

使用動態位元組順序偵測:

<code class="cpp">#define htonll(x) ((1 == htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1 == ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))</code>
  • 宏htonll 透過交換將64 位元整數x 轉換為網路字元節順序如果目標架構是小尾數,則為32 位元字。
  • ntohll 執行相反的操作,從網路位元組順序轉換為本機位元組順序。

使用預處理器宏:

<code class="cpp">#if __BIG_ENDIAN__
# define htonll(x) (x)
# define ntohll(x) (x)
#else
# define htonll(x) (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif</code>
  • 此方法使用基於大多數編譯器提供的__BIG_ENDIAN__ 或__LITTLE_ENDIANIAN__ 預處理器符號的預處理器巨集定義htonll 和ntohll。
  • 如果架構很大- endian(符號定義),函數只傳回輸入值,因為不需要位元組交換。
  • 對於小端架構,函數執行位元組交換,如前面的範例。

以上是如何用 C 語言實作可移植的 64 位元整數位元組排序函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn