NSData到原语

时间:2013-09-23 13:46:23

标签: ios objective-c c macos

我有NSData *data。它的值是000e

因此十进制值为14

现在我希望将此值转换为原始NSUInteger

我试过

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

*hereIWant14值为3584六位数为e00。现在我不知道是否存在字符串或类型大小的问题,或者我的想法是完全错误的,000ee00相似性只是纯粹的意外。

2 个答案:

答案 0 :(得分: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.

方法签名意味着:

Endian + U表示无符号S表示有符号+位数+ N 是系统的本机字节序, L 是小端, B 是大端

因此,如果你有一个带有内容(0x00,0xE0)的NSData,并且你想将它解释为值14,那么它包含大端序的数据,因此你必须使用 EndianU32_BtoN (当然,这个宏是big-endian系统上的身份转换,只在little-endian机器上交换字节)。

重要提示:为了面向未来,我建议您使用其他东西而不是NSUInteger,因为此类型的宽度可能因系统而异(例如Apple在arm64系统上将NSUInteger定义为64位)。因此,要明确位数,请使用uint32_t或uint64_t等。

编辑:Big-Endian短值的用法

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

答案 1 :(得分:2)

是的,这是因为所说的结束。

如果您需要从NSData中读取两段代码:

u_int16_t signature;
[data getBytes:&signature           range:NSMakeRange(0, 2)];
signature = CFSwapInt16(signature);

通常我使用CFSwapInt16或CFSwapInt32(对于u_int32_t)。否则,如果你必须阅读一个字符串:

char charArray[length];
[data getBytes:charArray range:NSMakeRange(0, length)];
NSData* data = [NSData dataWithBytes:charArray length:length];
NSString* string = [[NSString alloc]initWithData:data encoding:NSStringEncodingConversionAllowLossy];

希望它可以提供帮助!