バイトスワップ
ホストのバイト順を調べる必要がある場合は、関数 CFByteOrderGetCurrent を使用できます。取り得る戻り値は、CFByteOrderUnknown、CFByteOrderLittleEndian、および CFByteOrderBigEndian です。
整数のバイトスワップ
Core Foundation は、CFSwapInt16、CFSwapInt32、および CFSwapInt64 というバイトスワップ用の 3 つの最適化原始関数を提供しています。他のすべてのスワップ関数は、これらの原始関数を使用して作業を行います。一般に、これらの原始関数を直接使用する必要はありません。
原始スワップ関数は無条件にスワップしますが、上位スワップ関数は、バイトスワップが不要な場合、つまりソースとホストのバイト順が同じ場合には何も行いません。整数型の場合、これらの関数は CFSwapXXXBigToHost と CFSwapXXXLittleToHost、CFSwapXXXHostToBig、および CFSwapXXXHostToLittle の形式をとります。ここで XXX は Int32 などのデータ型です。たとえば、データがネットワークのバイト順 (ビッグエンディアン) から 16 ビットの整数値を読み取っているリトルエンディアンマシンの場合、関数 CFSwapInt16BigToHost を使用します。リスト 1 は、このプロセスを示しています。
リスト 1 : 16 ビット整数のスワップ
SInt16 bigEndian16; SInt16 swapped16; // Swap a 16 bit value read from network. swapped16 = CFSwapInt16BigToHost(bigEndian16);
バイト順 の節は、リトルエンディアンマシン上で作成され、ディスクに保存された後、ビッグエンディアンマシン上のディスクから読み込まれた単純な C 構造体の例を紹介しました。状況を修正するには、各フィールドのバイトをスワップしなければなりません。リスト 2 のコードは、これを行うために Core Foundation のバイトスワップ関数をどのように使用するかを示しています。
リスト 2 : C 構造体内のフィールドのバイトスワップ
// Byte swap the values if necessary. aStruct.int1 = CFSwapInt32LittleToHost(aStruct.int1) aStruct.int2 = CFSwapInt32LittleToHost(aStruct.int2)
ビッグエンディアンアーキテクチャーであると仮定すると、リスト 2 で使用される関数は各フィールド内のバイトをスワップします。図 1 は、フィールド aStruct.int1 でのバイトスワップの影響を示しています。バイトスワップのコードは、リトルエンディアンマシンで実行されるときは何も行わない事に注意して下さい。コンパイラはコードを最適化し、データを変更しないままにします。
図 1 : 4 バイトのリトルエンディアンからビッグエンディアンへのスワップ
浮動小数点値のバイトスワップ
単一のプラットフォーム上であっても、浮動小数点値にはさまざまな表現が可能です。非常に慎重でない限り、浮動小数点値をプラットフォームの境界を超えて渡そうとすると頭痛に悩まされます。浮動小数点数を扱うのに役立つように、Core Foundation では、整数スワップ関数に加えて、一連の関数と 2 つの特殊なデータ型を定義しています。これらの関数を使用すると、32 ビットと 64 ビットの浮動小数点値を後で復号し、必要に応じてバイトスワップできるようにコード化できます。リスト 3 に、64 ビット浮動小数点数をコード化する方法と、復号する方法を リスト 4 に示します。
リスト 3 : 浮動小数点値のコード化
Float64 myFloat64; CFSwappedFloat64 swappedFloat; // Encode the floating-point value. swappedFloat = CFConvertFloat64HostToSwapped(myFloat64);
リスト 4 : 浮動小数点値の復号化
Float64 myFloat64; CFSwappedFloat64 swappedFloat; // Decode the floating-point value. myFloat64 = CFConvertFloat64SwappedToHost(swappedFloat);
データ型 CFSwappedFloat32 および CFSwappedFloat64 には、正準表現の浮動小数点値が含まれています。CFSwappedFloat 自体は浮動小数点では ありません ので、そのまま使用するべきではありません。ただし、1 つのプロセスを別のプロセスに送信したり、ディスクに保存したり、ネットワーク経由で送信したりできます。形式は変換関数によって標準形式との間で変換されるため、明示的なスワップ API は必要ありません。 必要に応じて、形式変換中にバイトスワップが処理されます。
前の章 次の章