差分
このページの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まではバイエンディアン。))/ | + | バイトオーダーとは、多バイトデータをメモリに格納する際のバイトの配置法のことで、エンディアンやエンディアンネスとも呼ばれる。 |
- | 例えば「0x1234CDEF」という32bitの数値のメモリ配置は、LE/BEでそれぞれ以下のようになる。 | + | バイトオーダーはコンピュータシステムごとに異なり、現在ではx86系などで使用される**リトルエンディアン(LE)**と、PowerPC((ビッグエンディアンなのはG5のみ。G4まではバイエンディアン。))/MC68000/ |
- | ^メモリ番地 ^LE ^BE | | + | 例えば「0x1234CDEF」という32bit値のメモリ配置は、LE/BEでそれぞれ以下のようになる。 |
- | | 0000 | EF | 12 | | + | |
- | | 0001 | CD | 34 | | + | |
- | | 0002 | 34 | CD | | + | |
- | | 0003 | 12 | EF | | + | |
- | LEの方はデータの下位バイトから、BEはデータの上位バイトから、それぞれメモリに順次格納する。人間から見ればBEの方が分かりやすいが、コンピュータ的にはLEの方が処理しやすいらしい。 | + | ^ 番地 |
+ | |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**と解釈され保存時とは異なる値になってしまう。 | ||
このように、データ保存環境のエンディアンとデータ読込環境のエンディアンが異なれば、保存時に意図したデータとは異なるデータになってしまう。これでは宜しくない。 | このように、データ保存環境のエンディアンとデータ読込環境のエンディアンが異なれば、保存時に意図したデータとは異なるデータになってしまう。これでは宜しくない。 | ||
===== バイトスワップ ===== | ===== バイトスワップ ===== | ||
+ | |||
異なるエンディアンで保存されたデータを正しく読み込むには、データの並び順を変えてやらなければならない。これがバイトスワップである。 | 異なるエンディアンで保存されたデータを正しく読み込むには、データの並び順を変えてやらなければならない。これがバイトスワップである。 | ||