首頁 > 後端開發 > C++ > 主體

如何在 C 中將 64 位元整數轉換為網路位元組順序?

Mary-Kate Olsen
發布: 2024-10-31 16:09:01
原創
701 人瀏覽過

How to Convert 64-bit Integers to Network Byte Order in C  ?

C 中64 位元整數的htonl :綜合指南

簡介:

許多網路協定需要儲存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) &amp; 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) &amp; 0xFFFFFFFF) << 32) | htonl((x) >> 32))
# define ntohll(x) (((uint64_t)ntohl((x) &amp; 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
#endif</code>
登入後複製

結論:

綜上所述,C 中沒有標準的 htonll 函數。但是,我們提供了可移植的實現,可以在運行時或編譯時確定位元組順序,從而允許將 64 位元整數轉換為網路位元組順序。

以上是如何在 C 中將 64 位元整數轉換為網路位元組順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!