1. ホーム
  2. c++

[解決済み】C++でビッグエンディアンとリトルエンディアンの値を変換するにはどうすればいいですか?

2022-04-04 21:43:39

質問

C++でビッグエンディアンとリトルエンディアンの値を変換するにはどうしたらいいですか?

わかりやすくするために、バイナリデータ(倍精度浮動小数点数、32ビットおよび64ビット整数)をあるCPUアーキテクチャから別のアーキテクチャに変換する必要があるんだ。 これはネットワークを介さないので、ntoh()や同様の関数はここでは機能しません。


注:私が受け入れた回答は、私がターゲットにしているコンパイラに直接適用されます(それが私がそれを選んだ理由です)。 しかし、ここには他のとても良い、よりポータブルな回答があります。

どのように解決するのですか?

もし、あなたが ビジュアル C++ は次のようにしてください。intrin.hをインクルードし、以下の関数を呼び出します。

16ビット数値の場合。

unsigned short _byteswap_ushort(unsigned short value);

32bitの数値の場合。

unsigned long _byteswap_ulong(unsigned long value);

64bitの数値の場合。

unsigned __int64 _byteswap_uint64(unsigned __int64 value);

8ビットの数字(chars)は変換する必要がありません。

また、これらは符号なし値に対してのみ定義されており、符号あり整数に対しても同様に機能します。

浮動小数点数および倍精度については、ホストマシーンのバイトオーダーに合っているかどうかに関係なく、通常の整数の場合より困難です。リトルエンディアンの浮動小数点数はビッグエンディアンのマシンで扱えますし、その逆もしかりです。

他のコンパイラにも同様の内部規定があります。

GCC を直接呼び出すことができます。 ここに書かれているように、いくつかのビルトインがあります。 :

uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)

(何かをインクルードする必要はない)。bits.hは同じ関数をgcc中心でない方法で宣言しているようです。

16ビットスワップは単なるビットローテーションです。

自前で開発するよりも、組込み系を呼び出す方がパフォーマンスとコード密度は高くなります。