バイトオーダー (byte order)
別名
・エンディアン (endian)
2bytes以上のバイト幅を持つ数値をコンピュータ内のメモリに格納するときや、データとして転送するときに、どのバイト位置のデータからメモリアドレスの昇順に格納するかとか、どのバイト位置のデータから先に転送するか、という順番のこと。エンディアンともいう。
通常のコンピュータでは、メモリには1byteごとに昇順のアドレスが付けられているが、2bytes以上の幅(サイズ)を持つ数値をメモリに格納する場合、1byteごとに分割してメモり上の各アドレスに格納する必要がある。このとき、どのバイト位置のデータをメモリ上のどの番地に格納するかということをバイトオーダーもしくはエンディアンという。最下位のバイトから順番にアドレスの昇順に格納するものをリトルエンディアンといい、最上位のバイトから順番にアドレスの昇順に格納するものをビッグエンディアンという。
アドレス |
+0
|
+1
|
+2
|
+3
|
リトルエンディアン | ||||
内容 |
0x78
|
0x56
|
0x34
|
0x12
|
ビッグエンディアン | ||||
内容 |
0x12
|
0x34
|
0x56
|
0x78
|
バイトオーダーによる格納方法の違い 4bytes幅のデータ「0x12345678(16進数表記)」を、異なるバイトオーダーでメモリ中へ格納したところ。最下位バイトから順に格納するのがリトルエンディアン、最上位バイトから順に格納するのがビッグエンディアン。 |
バイトオーダーはコンピュータのアーキテクチャによって決まっており、例えばIntel系のプロセッサではリトルエンディアンが、Motorola系のプロセッサではビッグエンディアンがそれぞれ伝統的に使われている。MIPSのRシリーズ系のプロセッサや、最近のプロセッサでは、どちらのモードにも切り替えられるバイエンディアンを採用しており、使用するOSの都合に合わせて自由に選べるようになっているものが多い。
バイトオーダーは、バイナリのデータファイルを読み書きするときや、ネットワークなどを通じて通信する場合に問題となる。バイトオーダーの異なるマシンでデータを読み書きすると、データの上位バイトと下位バイトの関係が入れ替わり、まったく異なった数値になるからだ。これを避けるためには、あらかじめ読み書きするバイトオーダーを決めておくか、どのバイトオーダーでデータを渡したかという情報も送る、バイトオーダーに依存しないようにアスキー文字列で表した数字列に変換して送る、などの工夫が必要となる。例えばTCP/IPでは、IPアドレスやポート番号などのバイナリデータは、ネットワークバイトオーダーに統一して、パケット中に格納する、という取り決めをしている。
バイトオーダーのことをエンディアンとも呼ぶのは、Jonathan Swift作の風刺小説『ガリバー旅行記』中のエピソードにちなんでいる。その第1部「小人国」では、卵を大きい方(丸い方)の端から割る流儀の人々(Big Endians)と、小さい方(とがった方)の端から割る流儀の人々の対立が描かれている(これは当時の宗教的な対立を揶揄している)。ここから、MSB側から先にメモリに格納することをBig Endian、LSB側から先にメモリに格納することをLittle Endianと呼ぶようになった。
Copyright (C) 2000-2007 Digital Advantage Corp.