0

私は持っていNSData *dataます。その値は000eです。

したがって、10 進数値は14です。

今、私はこの値をプリミティブに取得したいと考えていますNSUInteger

私はもう試した

NSUInteger *hereIWant14 = (NSUInteger *)data.bytes;

しかし、*hereIWant14値は163584e00数です。エンディアンや型サイズに問題があるのか​​ 、それとも私の考えが完全に間違っているのか、000eそしてe00類似性は単なる偶然なのかはわかりません。

4

2 に答える 2

2

それはエンディアンに関連しています。Endian.h で定義されている変換マクロを使用します。

EndianU16_BtoN(value)
EndianU16_NtoB(value)
EndianS32_BtoN(value)
EndianS32_NtoB(value)
EndianU32_BtoN(value)
EndianU32_NtoB(value)
EndianS64_BtoN(value)
EndianS64_NtoB(value)
EndianU64_BtoN(value)
EndianU64_NtoB(value)
etc.

メソッド シグネチャの意味は次のとおりです。

符号なしのエンディアン + U 符号付きの S + ビット数 + Nはシステムのネイティブ エンディアン、Lはリトル エンディアン、Bはビッグ エンディアン

したがって、コンテンツ (0x00、0xE0) を持つ NSData があり、それを値 14 として解釈したい場合、データはビッグ エンディアン順で含まれているため、EndianU32_BtoNを使用する必要があります(もちろん、このマクロは、ビッグ エンディアン システムでの恒等変換であり、リトル エンディアン マシンでのみバイトを交換します)。

重要: 将来を見越して、NSUInteger の代わりに別のものを使用することをお勧めします。これは、この型の幅がシステムによって異なる可能性があるためです (たとえば、Apple は NSUInteger を arm64 システムで 64 ビットと定義しています)。したがって、ビット数を明示するには、uint32_t または uint64_t などを使用します。

編集:ビッグエンディアンの短い値の使用法

NSMutableData * data = [[NSMutableData alloc] initWithLength:2];
((unsigned char *)data.mutableBytes)[0] = 0x00;
((unsigned char *)data.mutableBytes)[1] = 0x0E;

NSUInteger integer = NSSwapBigShortToHost(*(unsigned short *)data.mutableBytes);

NSLog(@"%d", integer); // prints 14
于 2013-09-23T13:53:02.847 に答える