ビッグエンディアンとリトルエンディアンの違い|変換方法と見分け方
この記事の要点
- Big Endianは最上位バイト、Little Endianは最下位バイトから並べます。
- 変換するときは16進数2桁を1バイトとして、バイトの順序だけを反転します。
- バイト順は、仕様書や既知の値と照合して判別するのが確実です。
Big EndianとLittle Endianの違い
Big Endian(ビッグエンディアン)は数値の最上位バイトを先頭に置き、Little Endian(リトルエンディアン)は最下位バイトを先頭に置きます。
32ビット値0x12345678を4バイトへ分けると12、34、56、78です。配置は次のようになります。
Big Endian:12 34 56 78
Little Endian:78 56 34 12
特徴の比較
| 項目 | Big Endian | Little Endian |
|---|---|---|
| 先頭バイト | 最上位バイト | 最下位バイト |
| 16進数表記との見た目 | 同じ順に見える | バイト単位で逆順に見える |
| 代表例 | ネットワークバイトオーダー | x86・x86-64 |
| 優劣 | 用途と仕様次第であり、方式そのものに絶対的な優劣はない | |
エンディアンの変換方法
変換の基本は、16進数2桁を1バイトとして順序を反転することです。32ビット値0x12345678を例に進めます。
- 接頭辞
0xを除き、16進数を2桁ずつ区切ります。12 | 34 | 56 | 78 - バイトの並びだけを反転します。
78 | 56 | 34 | 12 - 必要な出力形式で連結します。
78563412または78 56 34 12
12345678を87654321にするのは誤りです。各バイト内の12、34、56、78はそのまま保ちます。
16・32・64ビットの変換例
| 幅 | Big Endian | Little Endian |
|---|---|---|
| 16ビット | 12 34 | 34 12 |
| 32ビット | 12 34 56 78 | 78 56 34 12 |
| 64ビット | 01 23 45 67 89 AB CD EF | EF CD AB 89 67 45 23 01 |
固定長データでは先頭の00も1バイトとして扱います。たとえば32ビット値0x00000020は、Little Endianでは20 00 00 00です。先頭のゼロを省くと幅が分からなくなるため注意してください。
バイト順の見分け方
任意のバイト列だけを見ても、Big EndianかLittle Endianかを必ず判別できるとは限りません。次の情報を使って判断します。
- 仕様書:通信プロトコル、ファイル形式、機器のデータシートにあるバイトオーダー指定を確認します。
- マジックナンバー:ファイル先頭などの既知の識別値と比較します。
- 妥当な値の範囲:サイズ、個数、時刻、バージョン番号として自然な値になる方を確認します。
- 複数のサンプル:1つの値だけで決めず、複数フィールドを同じ順序で読めるか検証します。
バイト列が20 00 00 00で、仕様上のサイズが32バイトなら、32ビットLittle Endianとして読むと0x00000020=32になり、整合します。
よくある間違い
- 16進数を1桁ずつ反転する:
12 34の変換結果は34 12であり、43 21ではありません。 - 文字列全体を逆順にする:エンディアン変換は文字列の反転処理ではありません。
- 各バイト内のビットも反転する:通常、
12というバイトのビット並びは変更しません。 - ビット幅を決めずに変換する:同じ
01でも16ビット値と32ビット値では必要なゼロ埋めが異なります。 - 符号とバイト順を混同する:符号付き整数の解釈は2の補数、バイトの配置はエンディアンとして別々に考えます。
よくある質問
0x12345678をLittle Endianにするとどうなりますか?
2桁ずつ1バイトに分けて順序を反転するため、12 34 56 78は78 56 34 12になります。16進数の桁を1桁ずつ逆にするわけではありません。
エンディアン変換でビット順も反転しますか?
通常は反転しません。変えるのはバイトの順序だけで、各バイト内のビット順は保ちます。
バイト列だけでエンディアンを必ず判別できますか?
任意のバイト列だけでは必ずしも判別できません。仕様書、既知の値、マジックナンバー、妥当なサイズや範囲と照合して判断します。
符号付き整数の変換方法は違いますか?
バイト順を反転する操作は同じです。ただし変換後の値を読むときは、ビット幅を固定し、最上位ビットを使って2の補数の符号付き整数として解釈します。