|
|
Log In | Not a Member? |
Contact ADC |
| < Previous PageNext Page > |
このセクションの例は、バイト順序がなぜ問題になるかを示すことを目的としています。Listing 3-1で定義しているCのデータ構造体を見てください。この構造体には、4バイトの整数、文字列、2バイトの整数が含まれています。このリストでは、構造体の初期化も行っています。
Listing 3-1 マルチバイトデータとシングルバイトデータを含んだデータ構造体
typedef struct { |
uint32_t myOptions; |
char myStringArray [7]; |
short myVariable; |
} myDataStructure; |
myDataStructure aStruct; |
aStruct.myOptions = 0xfeedface; |
strcpy(aStruct.myStringArray, "safari"); |
aStruct.myVariable = 0x1234; |
Figure 3-1では、このデータ構造体が、ビッグエンディアンとリトルエンディアンのシステムでメモリにどのように格納されるかを比較しています。ビッグエンディアンのシステムでは、メモリは、各データバイトのアドレスが最上位バイトから最下位バイトに向かって大きくなるように編成されます。リトルエンディアンのシステムでは、メモリは、各データバイトのアドレスが最下位バイトから最上位バイトに向かって大きくなるように編成されます。
Figure 3-1の以下の点に注目してください。
図に示されている32ビット変数や16ビット変数などのマルチバイトデータは、ビッグエンディアンとリトルエンディアンのシステムとでは格納方法が異なります。図を見て分かるように、ビッグエンディアンのシステムでは、データの最上位バイトが最も小さい値のアドレスに格納されるようにメモリにデータが格納されます。リトルエンディアンのシステムでは、データの最上位バイトが最も大きな値のアドレスに格納されるようにメモリにデータが格納されます。したがって、myOptions変数の最下位バイト(0xce)は、ビッグエンディアンのシステムではメモリ位置0x00000003、リトルエンディアンのシステムではメモリ位置0x00000000に格納されます。
文字配列myStringArrayのchar の値などのシングルバイトデータは、システムのバイト順序のフォーマットに関係なく、どちらのシステムでも同じメモリ位置に格納されます。
どちらのシステムも、4バイトのデータアラインメントを維持するためにバイトのパディングを行います。パディングされるバイトは、図中ではアスタリスク記号を含んだ網掛けの四角で示しています。
メモリにおけるマルチバイトデータのバイト順序は、あるアーキテクチャで書き出されたデータを別のアーキテクチャを使用するシステムで読み取り、バイト単位でデータにアクセスする場合に問題になります。たとえば、アプリケーションがmyOptions変数の2バイト目にアクセスするように書かれている場合、逆のバイト順序方式を使用しているシステムからデータを読み取ると、取得されるのは、myOptionsの2バイト目ではなく1バイト目になります。
Listing 3-1に示したコードで初期化されたサンプルデータの値が、リトルエンディアンのシステムで生成され、ディスクに保存されたとします。このとき、データはバイトアドレスの順にディスクに書き出されるものとします。ビッグエンディアンのシステムによってディスクから読み出されるとき、データは、Figure 3-1に示すようにメモリに再配置されます。問題は、データはビッグエンディアンのシステムで解釈されるにもかかわらず、バイト順序が依然としてリトルエンディアンのままである点です。この違いが原因で、値が間違って評価されることになります。この例では、フィールドmyOptionsの値は0xfeedfaceでなければなりませんが、バイト順序が間違っているために0xcefaedfeと評価されてしまいます。
注: 「ビッグエンディアン」と「リトルエンディアン」という用語は、ジョナサンスウィフトの18世紀の風刺小説「ガリバー旅行記」に由来します。ブレフスキュ帝国の臣民は、卵を大きいほうの端から食べる人々(ビッグエンディアン)と、小さいほうの端から食べる人々(リトルエンディアン)に分かれていました。
| < Previous PageNext Page > |
Last updated: 2006-03-08
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |