エンディアン

マルチバイトデータのバイト順序。ビッグエンディアンとリトルエンディアンの 2 種類がある。

エンディアン (Endianness) とは、マルチバイトデータをメモリやファイルに格納する際のバイト順序を指します。上位バイトを先に格納するビッグエンディアン (BE) と、下位バイトを先に格納するリトルエンディアン (LE) の 2 種類があります。この用語はジョナサン・スウィフトの小説「ガリヴァー旅行記」に登場する、卵をどちらの端から割るかで争う寓話に由来しています。

具体例で説明すると、16 進数 0x1234 を 2 バイトで格納する場合、ビッグエンディアンでは 12 34 の順に、リトルエンディアンでは 34 12 の順にメモリに配置されます。人間にとってはビッグエンディアンのほうが直感的ですが、加算処理などではリトルエンディアンのほうが効率的な場合があります。コンピュータアーキテクチャの書籍で詳しく学べます。

プロセッサごとにエンディアンの採用方針が異なります。Intel の x86/x64 プロセッサはリトルエンディアンを採用しており、現在のデスクトップ PC やサーバーの大半がこの方式です。一方、ネットワークプロトコル (TCP/IP) はビッグエンディアン (ネットワークバイトオーダー) を標準としています。ARM プロセッサはバイエンディアン (両方対応) で、OS やファームウェアの設定で切り替えられます。Apple Silicon (M1 以降) はリトルエンディアンモードで動作しています。

文字エンコーディングにおいて、エンディアンは UTF-16 と UTF-32 で特に重要です。UTF-16 では同じ文字でも BE と LE でバイト列が異なるため、エンディアンの不一致は文字化けの直接的な原因になります。この問題を解決するために BOM (Byte Order Mark, U+FEFF) が導入されました。ファイル先頭に BOM を配置することで、読み取り側がエンディアンを自動判別できます。UTF-16BE は FF FE、UTF-16LE は FE FF が BOM として使われます。

よくある落とし穴として、異なるエンディアンのシステム間でバイナリデータを交換する際の変換忘れがあります。ネットワークプログラミングでは htons() (host to network short) や ntohl() (network to host long) といった変換関数を使ってバイトオーダーを明示的に変換する必要があります。この変換を怠ると、数値データが正しく解釈されず、デバッグが困難なバグの原因となります。低レイヤプログラミングの書籍も参考になります。

文字数カウントの観点では、エンディアンは文字のバイト表現に影響しますが、文字数自体は変わりません。ただし、バイト数カウントではエンディアンと BOM の有無を考慮する必要があります。UTF-16 ファイルに BOM が付加されている場合、先頭の 2 バイトはテキスト内容ではなくメタ情報であるため、正確なバイト数を算出する際には BOM を除外して計算するのが適切です。