2018年9月23日日曜日

バイトオーダ

最近はあまりバイトオーダを気にしないが、CPUが異なる機種同士で通信などする場合はとても大切です。 バイトオーダとは、メモリの低いアドレスに最下位ビットを含むバイトを格納するか、最上位ビットを含むバイトを格納するかのこと。前者をリトルエディアンと言い、後者をビッグエンディアンと言う。 IntelのCPUはリトルインディアン。最近は殆どがIntelのCPUだからリトルインディアン。

以下はリトルインディアンです。たとえば、「1234567890」と書かれたテキストファイルをダンプ表示すると、 並びが「1234567890」ではなく、「2143658709」と並んでいます。

[vagrant@localhost ~]$ cat text
1234567890

[vagrant@localhost ~]$ od -x text
0000000 3231 3433 3635 3837 3039 000a 0000013

これは、ワード(2Byte)表示だから「12」では最下位ビットを含むバイトは「2」。メモリの低いアドレスは0番地。 よって、メモリの0番地に「2」、1番地に「1」が格納され「21」と表示されます。これがビッグエンディアンなら、メモリの0番地に「1」、1番地に「2」が格納され「12」と表示されます。 のようにCPUによってバイトオーダが異なります。1種類にCPUで閉じれば問題ないことですが、異なるCPU間で通信する場合は、ネットワークバイトオーダがあります。ネットワークバイトオーダはビッグエンディアンです。 c言語でTCP/IP通信(ソケット通信)する場合は、ネットワークバイトオーダに変換して通信を行います。

0 件のコメント:

コメントを投稿