[解決済み】C++でビッグエンディアンとリトルエンディアンの値を変換するにはどうすればいいですか?
質問
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ビットスワップは単なるビットローテーションです。
自前で開発するよりも、組込み系を呼び出す方がパフォーマンスとコード密度は高くなります。
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] 1サイクルあたり4FLOPの理論上の最大値を達成するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】'std::cout'への未定義の参照