エンディアンとは?バイトオーダーの仕組みをわかりやすく解説
この記事の要点
- エンディアンは、複数バイトの数値を保存・送信するときのバイト順です。
- Big Endianは上位バイトから、Little Endianは下位バイトから並べます。
- CPU、バイナリファイル、通信プロトコルの境界でバイト順の確認が重要です。
エンディアンとは何か
エンディアン(endianness)とは、2バイト以上で構成される数値をメモリ、ファイル、通信データに格納するときのバイトの並び順です。バイトオーダーとも呼ばれます。
たとえば32ビットの整数0x12345678は、12、34、56、78という4バイトで構成されます。この4バイトを先頭からどの順番で置くかがエンディアンの違いです。
バイトオーダーの考え方
16進数2桁は1バイトです。0x12345678では、左端の12が数値への影響が最も大きい最上位バイト、右端の78が最も小さい最下位バイトです。
0x12 | 0x34 | 0x56 | 0x78
上位 ← 数値としての重み → 下位1バイトの値は並べ替える対象がないため、通常はエンディアンの違いがありません。違いが現れるのは、16ビット、32ビット、64ビットなどの複数バイト値です。
Big EndianとLittle Endian
| 方式 | 先頭に置くバイト | 0x12345678の配置 |
|---|---|---|
| Big Endian | 最上位バイト | 12 34 56 78 |
| Little Endian | 最下位バイト | 78 56 34 12 |
どちらも同じ値を表せます。違うのは保存時の配置です。ただし、Little Endianのバイト列をBig Endianとして読むと0x78563412になり、本来とは別の数値として解釈されます。
なぜ複数の方式があるのか
CPUアーキテクチャやシステム設計の歴史によって、採用されたバイト順が異なるためです。現在も既存ソフトウェアやデータ形式との互換性が必要なので、片方へ完全に統一されてはいません。
重要なのは、どちらが正しいかではなく、扱うデータの仕様と一致しているかです。データを作る側と読む側が同じバイトオーダーを使えば、値を正しく共有できます。
エンディアンが使われる場面
| 場面 | 代表例 | 確認するもの |
|---|---|---|
| CPU・メモリ | x86・x86-64はLittle Endian | 実行環境のアーキテクチャ |
| ネットワーク | ネットワークバイトオーダーはBig Endian | 通信プロトコル |
| バイナリファイル | 画像、音声、実行形式、計測データ | ファイル形式の仕様 |
| 組み込み・制御 | レジスタ、センサー、PLC、Modbus | 機器のデータシート |
正しく扱うためのポイント
- 仕様を先に確認する:CPUの種類だけで決めず、ファイル形式や通信プロトコルの指定を確認します。
- データ幅を揃える:16・32・64ビットなど、何バイトの値なのかを確定します。
- 符号の有無を分ける:バイト順と、符号付き・符号なし整数の解釈は別の問題です。
- 境界で変換する:読み込み・書き出し・送受信のタイミングで、必要な場合だけ変換します。
- 既知の値で検証する:マジックナンバーや固定値を使うと、誤ったバイト順を発見しやすくなります。
よくある質問
1バイトの値にもエンディアンはありますか?
1バイトの中ではバイトを並べ替えられないため、通常はエンディアンの違いを考える必要はありません。2バイト以上の値で違いが現れます。
エンディアンが違うと数値そのものも変わりますか?
正しく解釈すれば数値そのものは変わりません。同じ数値を保存・送信するときのバイト配置が異なります。誤った順序で読むと別の数値として解釈されます。
ネットワークバイトオーダーはどちらですか?
TCP/IPで使われるネットワークバイトオーダーはBig Endianです。送受信時にはホスト側のバイトオーダーとの変換が必要になる場合があります。
文字列にもエンディアンは関係しますか?
ASCIIやUTF-8のようなバイト列を単純に逆順にする話ではありません。ただしUTF-16やUTF-32など、複数バイトのコード単位を使う文字エンコーディングにはバイト順が関係します。