ホームページ  >  記事  >  バックエンド開発  >  ntohl() を超えて C で 64 ビット整数を変換するにはどうすればよいですか?

ntohl() を超えて C で 64 ビット整数を変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 11:27:27405ブラウズ

How to Convert 64-Bit Integers in C   Beyond ntohl()?

C での 64 ビット整数変換: ntohl() を超えて

ドキュメントで示唆されている htonl() 関数は制限されています32 ビット整数への変換。ただし、64 ビット変換が必要な状況では、いくつかのオプションが利用可能です。

標準ライブラリ関数

Linux (glibc >= 2.9) および FreeBSD の場合、 htobe64() 関数を使用すると、64 ビット整数をビッグ エンディアンからリトル エンディアンに変換できます。この関数は標準 C ライブラリの一部です。

共用体ベースのアプローチ

代わりに、共用体を使用して 64 ビット整数と 8 バイト間の変換を行うこともできます。文字配列。このアプローチには、ビッグ エンディアン プラットフォームに合わせてバイトを手動で交換することが含まれます。

プリプロセッサ マクロ

プラットフォーム固有の違いを隠し、統一されたアプローチを提供するには、次のコードを使用できます。プリプロセッサ コード:

<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>

このコードは、Linux、OpenBSD、FreeBSD、および NetBSD 上で Linux/FreeBSD スタイルのマクロを提供します。

使用例

推奨されるアプローチの使用法を示すために、次のコードを検討してください。

<code class="cpp">#include <stdint.h>    // For 'uint64_t'

int main() {
  uint64_t host_int = 123;
  uint64_t big_endian;

  big_endian = htobe64(host_int);
  host_int = be64toh(big_endian);

  return 0;
}</code>

このコードは、64 ビット整数 host_int をリトル エンディアンからビッグ エンディアンに変換し、その値を効果的に保持します。

以上がntohl() を超えて C で 64 ビット整数を変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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