我有NSData *data
。它的值是000e
。
因此十进制值为14
。
现在我希望将此值转换为原始NSUInteger
。
我试过
NSUInteger *hereIWant14 = (NSUInteger *)data.bytes;
但*hereIWant14
值为3584
六位数为e00
。现在我不知道是否存在字符串或类型大小的问题,或者我的想法是完全错误的,000e
和e00
相似性只是纯粹的意外。
答案 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];
希望它可以提供帮助!