そもそもエンディアンって何??
2バイト以上のデータをメモリ上に展開したり、どこかに送ったり、保存するときの「バイト単位で見たときのデータの並び順」のこと
つまり下のようにどうやって塊(バイト)を並べるかってこと(バイトは0x07みたいな8bitの塊)
hoge
0x68 0x6f 0x67 0x65
egoh
0x65 0x67 0x6f 0x68
由来
ガリバー旅行記に出てくるゆで卵の割り方が由来らしい
Endianという呼び方は、もともとはガリバー旅行記に出てくる、ゆで卵をどちらの端の方から最初に割るかという議論に由来している。
物語中では、大きな方の端から割る人々はBig End-ian、尖った方の端から割る人々はLittle End-ianと呼ばれていた(-ianは「~な人々」を表す接尾辞)。[1]
具体的なエピソードは以下のサイトに載ってます
http://fujimura2.fiw-web.net/java/mutter/endian/index.html
ビッグエンディアン
先頭から順にデータを保存していく方式。
つまり、日本語のように左から右へデータを保存するのがビッグエンディアン。
hogeをバイトで表すと以下のようになる。
hoge
0x68 0x6f 0x67 0x65
リトルエンディアン
逆順でデータを保存していく方式。
下から順にバイトを読むような方式になるのがリトルエンディアン。
hogeをバイトで表すと以下のようになる。
egoh(hogeを逆側から)
0x65 0x67 0x6f 0x68
何でこんなことが発生するん??
普通に考えてビッグエンディアンだけでええやんって思ってしまう。
リトルエンディアン方式が採用されている理由として、計算速度が少しだけ早いパターンがあるということが挙げられる。
計算するときのことを考えるとわかりやすくて、
42+39をする時、
- 下の位である2と9を足す。
- 繰り上がった1と4と3を足す
こんな流れで計算することになると思う。
これが、下の位から保存していくリトルエンディアンの考え方と一致するため、リトルエンディアンの保存形式の方が少し計算が速くなる。
一方で、ビッグエンディアンの場合は一旦全部の数字を読みだしてから計算する必要があるため、リトルエンディアンに比べて少し遅くなるというわけ
ただ、ビッグエンディアンの方が当然人間にとっては直感的なわけで、プログラムを書く人間からするとビッグエンディアンの方が分かりやすい
どっちの形式か判定するためのBOM
二つの方式があると当然、どんな順番でデータを読めばよいか分からなくなるという問題が発生する
UTF-16だとデータの先頭に FE FF
が付くとビッグエンディアンが続くと表され、FF FE
でリトルエンディアンが続くと表される。
UTF-32だと00 00 FE FF
がビッグエンディアンで、FF FE 00 00
がリトルエンディアンである。
これによって、読み込む方式が違うことによる文字化けを防ぐことができるというわけ
引用
[1] ZDNET JAPAN エンディアン
https://japan.zdnet.com/glossary/exp/エンディアン/?s=1