ホームページ >バックエンド開発 >C++ >C でネットワークとホストのバイトオーダー間で 64 ビット値を変換する方法

C でネットワークとホストのバイトオーダー間で 64 ビット値を変換する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 04:42:30826ブラウズ

How to Convert 64-bit Values Between Network and Host Byte Order in C  ?

ntohl() 64 ビット値の拡張

C 関数 ntohl() は通常、ネットワークからの 32 ビット値を変換するために使用されます。バイトオーダーからホストバイトオーダーへ。ただし、特定のシナリオでは、64 ビット値に対して同様の操作が必要になる場合があります。

解決策

htonl() のマニュアル ページには、32 ビット値への制限が示されています。特定のプラットフォームでは unsigned long のサイズが 32 ビットであるため、ビット値。 64 ビット変換の必要性に対処するには、いくつかのアプローチを検討できます。

標準ライブラリ:

  • htobe64() および be64toh() : これらの関数は、Linux (glibc >= 2.9) および FreeBSD で、ビッグ エンディアンとリトル エンディアンの間で 64 ビット値を変換するために使用できます。

実装に関する提案:

  • unsigned long long と char[8] の共用体: プラットフォームがビッグ エンディアンでない場合、共用体を使用して手動でバイトを交換できます。ただし、この方法はシステム依存の前提に依存するため推奨されません。

プリプロセッサ マジック:

  • プラットフォーム固有のヘッダー: 次のプリプロセッサ コードにより、Linux、FreeBSD、OpenBSD などのさまざまなプラットフォーム間での移植性が可能になります。
<code class="cpp">#if defined(__linux__)
#  include <endian.h>
#elif defined(__FreeBSD__) || defined(__NetBSD__)
#  include <sys/endian.h>
#elif defined(__OpenBSD__)
#  include <sys/types.h>
#  define be16toh(x) betoh16(x)
#  define be32toh(x) betoh32(x)
#  define be64toh(x) betoh64(x)
#endif</code>

使用例:

プリプロセッサ マジックを使用すると、次のコード スニペットを使用して変換を実行できます:

<code class="cpp">  #include <stdint.h>

  uint64_t  host_int = 123;
  uint64_t  big_endian;

  big_endian = htobe64( host_int );
  host_int = be64toh( big_endian );</code>

このアプローチでは、複数のプラットフォーム間で互換性のある標準 C ライブラリのようなインターフェイスが提供されます。

以上がC でネットワークとホストのバイトオーダー間で 64 ビット値を変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。