next up previous contents
Next: 浮動小数点 Up: 異機種間でのデータの交換 Previous: 異機種間でのデータの交換

バイトオーダ

例えば4バイトの整数を考えたときLSB(リーストシグニフィカントビット)は 一番小さい側のビットのことを指します。4バイト整数を1増やすということは LSBに1を加えるということです。現在の計算機はほとんど32ビットをひとまと まりのデータとして扱います。バスも32ビット幅以上あります。バスライン上 ではLSBもMSB(モーストシグニフィカントビット)も明確に規定されています。 しかし、UNIXのファイルはバイト単位のデータの流れと考えられていますから ここで、はたと考えてしまいます。4バイト整数をファイルに書くとき、バイ ト列に置き換えますが、LSB側のバイトを先に送り出すべきでしょうか(大きい バイトが後になるのでビッグエンディアンと呼ばれます)MSB側を先に送り出す べきでしょうか(これは逆にリトルエンディアンと呼ばれます)。

このことは4バイト整数をメモリー上に記録する場合も同じように考えなけ ればなりません(実はファイルに書き込まれるというのはメモリー上のイメー ジをそのまま書き出すことになりますから上の議論と等価なのですが)。メモ リーには一様にアドレスが割り振られますが、バイト単位にアドレスが振られ ているとすると4バイト整数は4バイト分の記憶域を占有します。このとき一番 若い番号のアドレスにはLSB側のバイトが入るべきでしょうかM SB側のバイト が入るべきでしょうか。

このバイトの順番(バイトオーダ)には世の中に2つの流儀があることになり ます。これは計算機のハードウエアに強く依存する性質で、非常に初期の段階 でUNIXが走ったPDP11ではビッグエンディアンで、初期のワークステーション に多く用いられたマイクロプロセッサMC68000系ではビックエンディアンとなっ ています。インテルのマイクロプロセッサ80386などはリトルエンディアンで す。この歴史からSUNやHP(昔のアポロ)はビックエンディアン、DECやインテル はリトルエンディアンとなっています。

このことがなにか問題になるでしょうか、一つの計算機の種類に閉じている 場合は別に何も問題ではありません。ところがリトルエンディアンの機械で書 いたバイナリーファイルをビッグエンディアンの機械で読もうとする、あるい はその逆をやろうとすると困ったことになります。例えば整数で1と書いたも のがバイトの順番が替わるために、そのまま読むと0x01000000というとてつも ない大きな数字になってしまいます。このときはバイトオーダを変換しなけれ ばなりません。普通バイトスワップと呼ばれています。逆にファイルの最初の データが例えば常に整数の1であると決めておきますと、そのファイルを読み 込んで最初のワードを見ると、0x00000001と読めたときはスワップは必要なし、 0x01000000と読めたときは必要ありと判断できます。

バイトオーダは整数や浮動小数点数などの表現で発生する問題ですが、通常 の文字列はどちらの機械でもアドレスの番号の小さいほうから大きいほうへ順 番に並べられます。文字列の部分はバイトスワップは常に必要ないということ です。

ネットワークプログラミングのところで説明しましたがこのバイトオーダは ネットワークを通しての通信までそれぞれの機械が自己流でやると訳がわから なくなります。そのためネットワークを流れるデータのバイトオーダはネット ワークバイトオーダと呼ばれリトルエンディアンであることが決まっています。



next up previous contents
Next: 浮動小数点 Up: 異機種間でのデータの交換 Previous: 異機種間でのデータの交換



Kinya Hibino
Sun Jan 14 21:50:32 JST 1996