2012-02-10 110 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本地化十進制數,但是這是在這種情況下不用擔心。