リトルエンディアンにハマった件

とあるデータ解析ライブラリを使用してハマったのでメモ

ライブラリ自体は数値を入れてやるとバイト形式の値が返ってくるものなのですが、どうも出力されたバイト出力をうまく解析できない。

データ自体は16進数の羅列なので、1バイトづつPHPのbase_convertを使って2進数化してやって、あとはお好みで処理すればいいのだが、なんかおかしいぞ。

うにゃうにゃ調べること1時間、これってリトルエンディアンじゃね?と気づき入れ替えをしてやったら出ましたよ。

ということでリトルインディアンに関して整理しておこう。ほぼWIKIの内容だす。

多バイトで構成されたデータをどうやって並べるかをインディアンと言う

インディアンにはリトルインディアンとビッグインディアンがある。

ビッグインディアンはデータをそのまま読んでいきます AA BB CC DD EE  とあれば AA BB CC DD EE の 順番で解析していく。

逆にリトルインディアンの場合は EE DD CC BB AA になります。要は逆さまに解析してくださいってことです。

なんでこんな処理が生まれたかというと、そうゆうCPUが売られているからw

CPUは1バイト単位のレジスタでデータを処理するのですが、インテル系のCPUはリトルエンディアン(逆さま)で読み込む仕様だかららしいです。

なんでわざわざ逆さまに。。。と思いますがもちろん気まぐれでそうしたわけではなくて、メリットがあるため。

私的な理解では逆さまにすると、下位のアドレスから先に読み込むことになるのでオフセットを気にしなくていいのが理由なのかと思います。

どうゆうことか超要約して説明します。説明用のお話なので間違っていても許して。

たとえば 00123  という値と00022  という値を足し算しましょう。

ビックエンディアンの場合、オフセット部分を常に意識してやらないといけないです。オフセットっていうのは、この場合は左側の0を意味します。なおCPUは左から値を読み込むルールとします。この場合

  00143
+00082
=00225

いつも左側の0の数を常に気にしないといけません。

もしこれがリトルインディアンだと0を気にしなくていいのです。

リトルエンディアンでは逆さまなので 34100   と  28000  の足し算をすることになります。CPUは左から読み込むので0は無視してよくて結局

  341
+28
=522

左詰めで計算しています。繰上げは右にシフト。最後に逆さまを戻すと 225となってビッグエンディアンと一致します。

どうも0を気にしなくてよいということはCPUにとっては計算が楽になるらしいようです。

まあリトルエンディアンがいいかビッグエンディアンがいいかなんでどうでもいいですけどね。わたしはC言語を使った組込み系の仕事をしないので、動けばそれでいいです。

でもプログラミングする際にバイト配列が出てきたらコイツは逆さまなのか?は常に意識しておきましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です