Cocoa (正確には Foundation フレームワーク) には、バイトのエンディアンを交換する関数があります: NSSwapInt
、NSSwapShort
、NSSwapLong
、およびNSSwapLongLong
. これらは何があってもバイトを交換します-スモールエンディアンの整数からビッグエンディアンの整数を作成し、その逆も同様です。
使用している形式がわかっている場合は、それをネイティブのエンディアンに交換する他の関数があります:NSSwapLittleIntToHost
およびNSSwapBigIntToHost
. ネイティブ形式からリトルエンディアン形式またはビッグ エンディアン形式にスワップする逆関数もありNSSwapHostIntToLittle
ますNSSwapHostIntToBig
。これらは、他の整数型と浮動小数点型にも使用できます。彼らが行うことは、必要に応じて値に対してプリミティブ スワップ関数を呼び出すことです。そのため、リトルエンディアン マシンでの結果を返すNSSwapLittleIntToHost
while は何もしません。NSSwapBigIntToHost
NSSwapInt
これらは、型ではなく、コンパイラの整数型のパラメーターを取ることに注意してくださいNSInteger
。したがって、生成するコードが 32 ビットか 64 ビットかに応じて、使用している場合は異なる関数を使用する必要がありますNSInteger
。
また、バイト配列を整数ポインターにキャストして逆参照しないでください。ビットシフト操作を使用して整数を組み立てる方がよいでしょう。コードNSInteger
は 32 ビット幅の場合にのみ機能します。64 ビットの場合、数値がガベージになるか、プログラムがクラッシュすることさえあります。ただし、常に 32 ビット幅の整数型 (たとえばint32_t
、C99 ヘッダーから)を使用している場合でも、これは期待どおりに機能しない可能性があります。<stdint.h>