在C 中搜尋「標準」64 位元htonl 函數
在C 中,htonl 函數用於轉換32 位元從主機位元組順序到網路位元組順序的位元整數。然而,對於 64 位元整數,目前該語言中沒有可用的「標準」htonll 函數。
htonll 的可移植實作
為了滿足這一需求,程式設計師設計了htonll 的可移植實作來處理跨不同平台(包括Windows、Linux 和AIX )的64 位元整數位元組順序轉換。一種這樣的實作是:
<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>
此實作使用htonl 函數進行32 位元轉換,並應用兩次,對於64 位元整數的每個32 位元一半各一次,同時也確保交換
確定字節序
由於C 缺乏在編譯時確定字節序的可移植方法,因此上面的實現通過調用在運行時檢查它htonl 對整數1進行處理。如果結果等於 1,則係統是小端位元組序,無需進行位元組交換。否則,它是大端字節序,並且實作會交換位元組。
使用編譯器指令的替代方法
另一種可移植實作使用編譯器指令來區分大端字節序和大端字節序小端架構:
<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 指令定義htonll 和ntohll 函數,大多數編譯器和作業系統都支援該指令。
以上是如何用 C 實作 64 位元 htonll 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!