C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でビッグエンディアンとリトルエンディアンの値を相互変換する方法


C++では、リトルエンディアンの値をビッグエンディアンへ、またその逆へ変換したい場面があります。ここでは、その具体的な変換方法を解説します。本題に入る前に、まず「ビッグエンディアン」と「リトルエンディアン」とは何かを確認しておきましょう。

エンディアンとは

マルチバイトデータ(2バイト以上で構成されるデータ)をメモリ上に格納する際のバイトの並び順は、CPUのアーキテクチャによって異なります。主な方式は次の2つです。

  • ビッグエンディアン: 上位バイト(高い桁のバイト)から先に格納する方式
  • リトルエンディアン: 下位バイト(低い桁のバイト)から先に格納する方式

例として、数値「0x76543210」を考えてみます。ビッグエンディアンの場合、メモリ上には次のように並びます。

C++でビッグエンディアンとリトルエンディアンの値を相互変換する方法

一方、リトルエンディアンの場合は、バイトの並びが逆順になります。

C++でビッグエンディアンとリトルエンディアンの値を相互変換する方法

バイト順を入れ替える仕組み

それでは、リトルエンディアンからビッグエンディアンへの変換(およびその逆)を行う方法を見ていきましょう。32ビット整数の場合、「1バイト目と4バイト目」「2バイト目と3バイト目」をそれぞれ入れ替えることで変換できます。この操作は、シフト演算とマスク(AND演算)を組み合わせた論理式で実現できます。

具体的には、元の値のコピーを4つ作成し、それぞれ次のように処理します。

  1. 1つ目のコピー: 24ビット右シフトし、最上位バイトを最下位バイトの位置へ移動
  2. 2つ目のコピー: 0x00FF0000でマスクした後、8ビット右シフト
  3. 3つ目のコピー: 0x0000FF00でマスクした後、8ビット左シフト
  4. 4つ目のコピー: 24ビット左シフトし、最下位バイトを最上位バイトの位置へ移動

最後に、この4つの結果を論理和(OR)で結合すると、バイト順が完全に反転した値が得られます。

サンプルコード

#include <iostream>

#define SWAP_INT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))

using namespace std;

// メモリ上のバイト列を16進数で表示する補助関数
void memory_represent(char *value, int n) {
    for (int i = 0; i < n; i++) {
        printf(" %.2x", value[i]);
    }
}

int main() {
    unsigned int x = 0x76543210;
    unsigned int y;

    cout << "リトルエンディアンでの値: ";
    memory_represent((char*)&x, sizeof(x));
    cout << endl;

    y = SWAP_INT32(x);

    cout << "変換後のビッグエンディアンの値: ";
    memory_represent((char*)&y, sizeof(y));
    cout << endl;

    return 0;
}

実行結果

リトルエンディアンでの値: 10 32 54 76
変換後のビッグエンディアンの値: 76 54 32 10

このように、SWAP_INT32マクロを使えば、外部ライブラリに依存することなく、シンプルなビット演算だけでエンディアンの相互変換が実現できます。

補足:標準ライブラリ関数の利用

なお、POSIX系環境では<arpa/inet.h>(Windowsでは<winsock2.h>)で提供されているhtonl()ntohl()などの関数を使うことでも、ホストバイトオーダーとネットワークバイトオーダー(ビッグエンディアン)の相互変換が可能です。用途や移植性の要件に応じて使い分けるとよいでしょう。


  1. C++とC#の違いとは?メモリ管理・実行速度・継承などを徹底比較

    C++とはC++は、静的型付けのコンパイル型言語であり、大文字と小文字を区別する自由形式の汎用プログラミング言語です。手続き型・オブジェクト指向・ジェネリックといった複数のプログラミングパラダイムをサポートしており、OSやゲームエンジン、組み込みシステムなど幅広い分野で活用されています。C++は、高水準言語の生産性と低水準言語ならではのハードウェア制御能力を兼ね備えていることから、「中級言語(ミドルレベル言語)」と位置づけられることもあります。C#とはC#は、マイクロソフトがアンダース・ヘルスバーグ(Anders Hejlsberg)の主導のもと、.NET構想の一環として開発した、シンプルでモ

  2. Excelでヘクタールとエーカーを相互変換する方法【数式とフィル機能の使い方】

    エーカー(Acre)とヘクタール(Hectare)は、土地の面積を表す際によく使われる面積の単位です。面積のメートル法における基本単位は平方キロメートルですが、特に農地などの土地面積を扱う場面では、エーカーやヘクタールが好んで使用されます。Microsoft Excelでセル内の値をヘクタールとエーカーの間で変換したい場合は、ぜひこの記事を参考にしてください。 Excelでヘクタールとエーカーを相互変換する方法 エーカー⇔ヘクタールの換算式 エーカーとヘクタールの間の換算式は以下の通りです。 1ヘクタール = 2.47105 エーカー 1エーカー = 0.404686 ヘクタール Exce