2010-03-16 94 views
1

我有我嘗試使用下面的代碼行變成一個NSString的NSData對象:轉換的NSData到一個NSString表示失敗

NSString *theData = [[NSString alloc] initWithData:photo encoding:NSASCIIStringEncoding]; 

不幸的是我得到了下面的結果,而不是我的所需的二進制輸出(我可以期待這裏的二進制輸出?);

ÿØÿà 

我很感激任何幫助。
謝謝。瑞奇。

+0

你想要的輸出是什麼? – kennytm 2010-03-16 11:22:46

+0

一串二進制數據。 – Ricky 2010-03-16 11:27:00

回答

4

如果要將某些任意的二進制數據轉換爲人類可讀的字符串(例如,一系列十六進制值),則使用的方法不正確。你正在做的是將數據本身解釋爲ASCII編碼的字符串。

要簡單地將數據記錄到文件或標準輸出中,可以使用[theData description]

0

你不能用initWithData:方法解析二進制數據。如果你想要內容的十六進制字符串,那麼你可以使用NSData的description方法。

+0

這是不正確的。 ' - [NSString initWithData:]'使用數據對象的全部內容(包括零字節)並在給定的編碼中解釋它。還要注意''\ 0''是ASCII中定義的字符。 – 2010-03-16 12:40:04

+0

但是,你當然是正確的,該方法不能用於產生人類可讀的字符串。 – 2010-03-16 12:41:00

2

你的意思是「二進制輸出」不清楚。如果您希望字符串包含「01010100011110110」或「0x1337abef」的文本,您會誤解NSString的工作原理。 NSString的initWithData:encoding:嘗試將數據的字節解釋爲它們是特定編碼中字符串的字節。這與NSString的dataUsingEncoding:相反 - 您可以撥打initWithData:encoding:,結果爲dataUsingEncoding:,然後找回完全相同的字符串。

如果您想將數據轉換爲可讀的十六進制數字字符串,您需要自己完成轉換。你可以這樣做:

NSMutableString *binaryString = [NSMutableString stringWithCapacity:[data length]]; 
unsigned char *bytes = [data bytes]; 
for (int i = 0; i < [data length]; i++) { 
    [binaryString appendFormat:@"%02x", bytes[i]]; 
} 
+1

我相信,而不是'data [i]'你的意思是'((unsigned char *)[data bytes])[i]'。 – 2010-03-17 11:21:29

+0

或多或少。更正了我以爲我是寫在第一位。 D'哦。 – Chuck 2010-03-17 15:52:56

+0

如果您已經使用性能優化'stringWithCapacity:'您應該計算正確的容量:'2 * [數據長度]'。 – 2010-03-17 17:12:10