C ++でビッグエンディアンとリトルエンディアンの値を変換するにはどうすればよいですか?
編集:わかりやすくするために、バイナリデータ(倍精度浮動小数点値と32ビットおよび64ビット整数)をあるCPUアーキテクチャから別のCPUアーキテクチャに変換する必要があります。これにはネットワーキングが含まれないため、ntoh()および同様の関数はここでは機能しません。
編集#2:私が受け入れた答えは、私がターゲットにしているコンパイラーに直接当てはまります(それが私がそれを選んだ理由です)。ただし、ここには他にも非常に優れた、より移植性の高い回答があります。
Visual C ++を使用している場合は、次のようにします。intrin.hをインクルードし、次の関数を呼び出します。
16ビット数の場合:
unsigned short _byteswap_ushort(unsigned short value);
32ビット数の場合:
unsigned long _byteswap_ulong(unsigned long value);
64ビット番号の場合:
unsigned __int64 _byteswap_uint64(unsigned __int64 value);
8ビットの数値(chars)は変換する必要はありません。
また、これらは符号なしの値に対してのみ定義され、符号付き整数に対しても機能します。
floatとdoubleの場合、単純な整数の場合と同様に、ホストマシンのバイト順である場合とない場合があるため、より困難です。ビッグエンディアンのマシンではリトルエンディアンのフロートを取得でき、その逆も可能です。
他のコンパイラにも同様の組み込み関数があります。
ではGCC例えば、あなたが直接呼び出すことができ、ここで文書化されているように、いくつかの組み込みコマンドを:
uint32_t __builtin_bswap32 (uint32_t x)
uint64_t __builtin_bswap64 (uint64_t x)
(何かを含める必要はありません)。Afaik bits.hは、gcc中心ではない方法でも同じ関数を宣言します。
16ビットスワップそれはほんの少し回転します。
独自にロールする代わりに組み込み関数を呼び出すと、最高のパフォーマンスとコード密度が得られます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加