2012-02-10 149 views
2

有一个特殊的NSStringinitWithData抓取位并将它们转换为字符串的方法。但是,我还没有发现在NSNumber类的ref。目前,我以NSData格式从服务器获取原始数据(字节)。我知道如何在C中使用memcpyint指针。但我很好奇从NSData直接做什么方便的方法。不需要转换。例如,我得到00000010字节,我需要将它转换为值为2的NSNumberNSInteger如何将NSData字节转换为NSNumber或NSInteger?

+0

如果您知道如何在c中执行此操作,则可以在objective-c中执行此操作。只需使用这些方法。用'[myNSData bytes]'获取原始字节。如果你想要,你可以为NSNumber创建一个类别,这样你就可以使用initWithData: – 2012-02-10 08:30:08

回答

8

NSData只是一个字节桶,并且不知道其中包含的数据。 NSStringinitWithData:encoding:方法是倒数(它对面)这个方法:

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding 

因此,要完全回答你的问题,是要知道你的号码最初是如何强迫一个NSData对象是很重要的。一旦你知道了编码函数,搜索就是用于相互函数的。

从问题中包含的内容可能会有许多不同的解决方案。但是,您可能可以使用以下行中的某些内容将您的NSData对象上的getBytes:length:转换为可用的数字格式。对于例如

NSUInteger decodedInteger; 
[myDataObject getBytes:&decodedInteger length:sizeof(decodedInteger)]; 

你可以改变的decodedInteger到任何适合你NSData对象的字节类型。

+0

如果您的对象包含多个值,那么您需要使用'NSRange'来提取每个单独的值,并使用'sizeof()'函数来移动整个数据的范围。 – ikuramedia 2012-02-10 08:51:17

+0

谢谢,它与getBytes一起工作。虽然它与我所期望的“initWithData”不一样,但它仍然比普通的c更像“objective-c”风格。 – Centurion 2012-02-10 09:16:49

+2

@Centurion当以这种方式序列化字节时,您应该始终考虑到字节序。请参阅Foundation/NSByteOrder.h中的'NSSwap ...'系列函数。 – Costique 2012-02-10 09:26:47

1

试试这个:

NSNumber *num = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsNSData]; 

编辑:

正如马蒂亚斯·鲍赫指出,这不会工作你的情况。这只适用于你的NSNumber对象被归档到NSData对象中。

+0

,它只适用于归档到NSData对象中的NSNumber对象,其中 – 2012-02-10 08:29:04

+0

为true。感谢您指出了这一点。编辑回复 – mbh 2012-02-10 08:32:27

-1

下面是答案

//Integer to NSData 
+(NSData *) IntToNSData:(NSInteger)data 
{ 
    Byte *byteData = (Byte*)malloc(4); 
    byteData[3] = data & 0xff; 
    byteData[2] = (data & 0xff00) >> 8; 
    byteData[1] = (data & 0xff0000) >> 16; 
    byteData[0] = (data & 0xff000000) >> 24; 
    NSData * result = [NSData dataWithBytes:byteData length:4]; 
    NSLog(@"result=%@",result); 
    return (NSData*)result; 
} 

参考https://stackoverflow.com/a/20497490/562812更多细节

0

的NSString救援:

const unsigned char *bytes = [serverData bytes]; 
NSInteger aValue = [NSString stringWithFormat:@"%2x", bytes[0]].integerValue; 

的文档警告使用NSScanner本地化十进制数,但是这是在这种情况下不用担心。