Apple Developer Connection
Advanced Search
Member Login 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  ビッグエンディアンのバイト順序とリトルエンディアンのバイト順序の比較

Figure 3-1 ビッグエンディアンのバイト順序とリトルエンディアンのバイト順序の比較

Figure 3-1の以下の点に注目してください。

メモリにおけるマルチバイトデータのバイト順序は、あるアーキテクチャで書き出されたデータを別のアーキテクチャを使用するシステムで読み取り、バイト単位でデータにアクセスする場合に問題になります。たとえば、アプリケーションがmyOptions変数の2バイト目にアクセスするように書かれている場合、逆のバイト順序方式を使用しているシステムからデータを読み取ると、取得されるのは、myOptionsの2バイト目ではなく1バイト目になります。

Listing 3-1に示したコードで初期化されたサンプルデータの値が、リトルエンディアンのシステムで生成され、ディスクに保存されたとします。このとき、データはバイトアドレスの順にディスクに書き出されるものとします。ビッグエンディアンのシステムによってディスクから読み出されるとき、データは、Figure 3-1に示すようにメモリに再配置されます。問題は、データはビッグエンディアンのシステムで解釈されるにもかかわらず、バイト順序が依然としてリトルエンディアンのままである点です。この違いが原因で、値が間違って評価されることになります。この例では、フィールドmyOptionsの値は0xfeedfaceでなければなりませんが、バイト順序が間違っているために0xcefaedfeと評価されてしまいます。

注: 「ビッグエンディアン」と「リトルエンディアン」という用語は、ジョナサンスウィフトの18世紀の風刺小説「ガリバー旅行記」に由来します。ブレフスキュ帝国の臣民は、卵を大きいほうの端から食べる人々(ビッグエンディアン)と、小さいほうの端から食べる人々(リトルエンディアン)に分かれていました。



< Previous PageNext Page >


Last updated: 2006-03-08




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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