脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

ネットワークバイトオーダー・ビッグエンディアン・リトルエンディアンとは

バイトオーダー

  • マルチバイトデータのメモリ上での並べ方(順番)のこと
  • ホストバイトオーダー、エンディアンともいう
  • この並べ順は統一されておらず、プロセッサの種類によって異なる



並べ方

ビッグエンディアン

  • データの上位バイトからメモリに並べる並べ方
    • 1234とデータがあったら1234とメモリに格納する(実際にはちょっと違いますが)
利点
  • バイナリダンプするとそのまま読める(人類に優しい)
仕様しているプロセッサ


トルエンディアン

  • データの下位バイトからメモリに並べる並べ方
    • 1234とデータがあったら4321とメモリに格納する(実際にはちょっと違いますが)
利点
  • コンピュータがデータを処理しやすい(コンピュータに優しい)
  • 処理速度が早い
採用しているプロセッサ


指定の仕方

  • バイト順マーク(Byte Order Mark、通称BOM)と呼ばれる特殊なコード (U+FEFF) をデータの先頭に付与することで、データを受け取る側がエンディアンを判別できるようになっている
  • BOMがない場合には、ビッグエンディアンだと決められている


確認

ビッグエンディアンの場合は

# echo -n "12345" | od -t x
0000000 34333231 00000035
0000005

トルエンディアンの場合は

# echo -n "12345" | od -t x
0000000 34333231 35000000
0000005


言葉の由来

  • ガリバー旅行記の「(半茹で)ゆで卵を大きい方(下方)の端っこから割る」派と「小さい方(上方)の端っこから割る」派から来ている
  • それぞれ、「大きい方の端(=”Big-End”)から割る」”Big-Endian”派と「小さい方の端(=”Little-End”)から割る」”Little-Endian”派となる



ネットワークバイトオーダー

  • TCP/IPネットワークでは異なるコンピュータ間通信が前提なので、エンディアンが統一されていないと困ってしまう
  • 対応として、ビッグエンディアンに統一した
    • これをネットワークバイトオーダーという



どんな時意識すればよいのか

  • ネットワークを通してバイト単位でデータをやりとりする場合
  • 異なるシステム間でバイナリファイル等を交換する場合
  • 異なるシステムにプログラムを移植する場合
  • 構成するプロセッサが異なるマルチプロセッサ環境で共有メモリを使用する場合