programming:バイトオーダーの変換_バイトスワップ

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
最新のリビジョン 両方とも次のリビジョン
programming:バイトオーダーの変換_バイトスワップ [2013-04-09 11:39]
Decomo Page moved from プログラミング:programming:programming:バイトオーダーの変換_バイトスワップ to programming:バイトオーダーの変換_バイトスワップ
programming:バイトオーダーの変換_バイトスワップ [2018-06-29 10:23]
Decomo
行 8: 行 8:
  
 ===== バイトオーダーとは何ぞや ===== ===== バイトオーダーとは何ぞや =====
-バイトオーダーとは、多バイトデータをメモリに格納する際の配置方法の種類のことで、エンディアンやエンディアンネスとも呼ばれる。 
  
-バイトオーダーはコンピュータシステムごと異なり、現在ではx86系などで使用され**リルエンディアン(LE)**と、PowerPC((ビッグエンディアンなはG5み。G4まはバイエンディアン。))/MC68000/SPARCなどで使用される**ビッグエンディアン(BE)**の2つに大別される。+バイトオーダー、多バイトデータをメモリ格納す際のバイトの配置法ことエンディアンエンディアンネスとも呼ばれる。
  
-例えば「0x1234CDEF」いう32bit数値メモリ配置、LE/BEぞれ以下ようになる。+バイトオーダーはコンピュータシステムごに異なり、現在ではx86系などで使用される**リトルエンディアン(LE)**と、PowerPC((ビッグエンディアンなはG5み。G4までバイエンディアン。))/MC68000/SPARCなど使用さる**ビッグエンディアン(BE)**2つ大別される。スマートフォンの台頭で一般的とったARM系はLEで使われことが多い
  
-^メモリ番地 ^LE ^BE +例えば「0x1234CDEF」という32bit値のメモリ配置は、LE/BEでそれぞれ以下のようになる。
-|  0000  |  EF  |  12  | +
-|  0001  |  CD  |  34  | +
-|  0002  |  34  |  CD  | +
-|  0003  |  12  |  EF  |+
  
-LEの方はデータの下位バイトから、BEはデータの上位バイトから、それぞれメモリ順次格納する。人間から見ればBEの方が分かりやすいが、コンピュータ的にはLEの方が処理しやすいらしい。+^  番地  ^  LE   BE  ^ 
 +|0000|EF|12| 
 +|0001|CD|34| 
 +|0002|34|CD| 
 +|0003|12|EF| 
 + 
 +リトルエンディアンはデータの下位バイトから、ビッグエンディアンはデータの上位バイトから、それぞれメモリの下位番地より順次配置される。人間から見ればビッグエンディアンの方が分かりやすいが、コンピュータ的にはリトルエンディアンの方が都合がいいらしい。また、データの下位バイトからメモリの下位番地に格納される、という意味ではリトルエンディアンの方が理にかなっていると考えることもできる
  
 ===== バイトオーダーの違いによる問題 ===== ===== バイトオーダーの違いによる問題 =====
-ここで上表のLEのメモリ番地0000〜0003の内容をそのままファイルに書き出したとしよう(つまりはデータの保存)。ファイルの内容は「EFCD3412」となるはずだ。 
  
-次に、そのファイルからメモリの状態を復元る事を考える(データの込み)+ここでリトルエンディアン環境で上表番地0000~0003の中身をファイルに書き出、つまりデータの保存を考えてよう。何も考えずに書き出せば、ファイルの内容は「EFCD3412」となる
  
-ファイル内容をそっくりメモリに展開すると、番地0000から上位番地へ向かって EF CD 34 12 の順で書き込まれる。このメモリ内容は、LE環境ならば元のデータ**0x1234CDEF**とるが、BE環境だと**0xEFCD3412**と解釈され保存した値とは違う値に化けてしまう。+次に、そのファイルからメモリの状態を復元、つまりデータの読み込みを考える。 
 + 
 +これまた何も考えずにファイル内容をメモリに展開すると、メモリ番地0000から上位番地へ向かって EF CD 34 12 の順で復元される。このメモリ内容は、リトルエンディアン環境ならば**0x1234CDEF**と正しく解釈されるが、ビッグエンディアン環境では**0xEFCD3412**と解釈され保存とは異なる値になってしまう。
  
 このように、データ保存環境のエンディアンとデータ読込環境のエンディアンが異なれば、保存時に意図したデータとは異なるデータになってしまう。これでは宜しくない。 このように、データ保存環境のエンディアンとデータ読込環境のエンディアンが異なれば、保存時に意図したデータとは異なるデータになってしまう。これでは宜しくない。
  
 ===== バイトスワップ ===== ===== バイトスワップ =====
 +
 異なるエンディアンで保存されたデータを正しく読み込むには、データの並び順を変えてやらなければならない。これがバイトスワップである。 異なるエンディアンで保存されたデータを正しく読み込むには、データの並び順を変えてやらなければならない。これがバイトスワップである。
  
  • programming/バイトオーダーの変換_バイトスワップ.txt
  • 最終更新: 2021-03-05 09:32
  • by Decomo