ポータブルな 64 ビット整数バイト順序関数を C で実装するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-01 01:33:28
オリジナル
323 人が閲覧しました

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

C での移植可能な 64 ビット整数バイト順序関数

質問:

htonl のような標準関数を取得できますかこれは C の 64 ビット整数で動作し、ネットワーク バイト オーダーへの変換を可能にしますか?

答え:

C には htonll のような明示的に定義された関数はありませんが、標準ライブラリを使用すると、移植可能な実装を作成できます。以下に 2 つのアプローチを示します。

動的エンディアンネス検出の使用:

<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_ENDIAN__ プリプロセッサ シンボルに基づくプリプロセッサ マクロを使用して htonll および ntohll を定義します。
  • アーキテクチャが大きい場合は、エンディアン (シンボル定義) の場合、バイト スワッピングは必要ないため、関数は単に入力値を返します。
  • リトル エンディアン アーキテクチャの場合、関数は前の例と同様にバイト スワッピングを実行します。

以上がポータブルな 64 ビット整数バイト順序関数を C で実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!