簡介:
許多網路協定需要儲存64 -「網路位元組順序」中的位元整數。這與主機位元組順序不同,可能會導致相容性問題。幸運的是,對於 32 位元整數,htonl 函數廣泛用於轉換為網路位元組順序。開發人員經常尋求 64 位元整數的類似函數。本文探討了此類函數的可用性,並在不可用的情況下提供了實作。
標準函數的存在:
不幸的是,沒有標準的 htonll 函數C 標準函式庫或任何廣泛採用的可移植函式庫。
實作:
在沒有標準函數的情況下,我們可以實作自己的可移植版本。這裡有兩種方法:
1。運行時位元組交換:
此方法透過使用 htonl(1) 在執行時間檢查位元組序來決定是否需要位元組交換。如果需要位元組交換,我們使用 htonl 交換 64 位元整數的 32 位元部分。此方法的程式碼是:
<code class="c++">#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))</code>
2。編譯時位元組交換:
如果您有權限存取定義預處理器巨集(如 __BIG_ENDIAN__)的編譯器,則可以使用它們在編譯時最佳化位元組交換過程。以下是一個例子:
<code class="c++">#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>
結論:
綜上所述,C 中沒有標準的 htonll 函數。但是,我們提供了可移植的實現,可以在運行時或編譯時確定位元組順序,從而允許將 64 位元整數轉換為網路位元組順序。
以上是如何在 C 中將 64 位元整數轉換為網路位元組順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!