2010-03-16 3 views
1

У меня есть объект NSData, который я пытаюсь превратить в NSString, используя следующую строку кода:Преобразование NSData к представлению NSString не удается

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

К сожалению, я получаю следующий результат, а не мой желаемый двоичный выход (можно ли здесь ожидать двоичный выход?);

ÿØÿà 

Буду признателен за любую помощь.
Спасибо. Рики.

+0

Каков ваш желаемый результат? – kennytm

+0

Строка двоичных данных. – Ricky

ответ

4

Если вы хотите преобразовать некоторые произвольные двоичные данные в читаемую пользователем строку (например, из серии шестнадцатеричных значений), вы используете неправильный метод. То, что вы делаете, это интерпретация самих данных как строки в кодировке ASCII.

Чтобы просто записать данные в файл или в стандартный вывод, вы можете использовать [theData description].

0

Вы не можете разобрать двоичные данные с помощью метода initWithData:. Если вы хотите шестнадцатеричную строку содержимого, вы можете использовать метод NSData description.

+0

Неправильно. '- [NSString initWithData:]' использует все содержимое объекта данных (включая нулевые байты) и интерпретирует его в данной кодировке. Также обратите внимание, что '' \ 0'' является определенным символом в ASCII. –

+0

Но вы, конечно, правы, что этот метод нельзя использовать для создания удобочитаемой строки. –

2

Что вы подразумеваете под «двоичным выходом», неясно. Если вы ожидаете, что строка содержит текст в строках «01010100011110110» или «0x1337abef», вы ошибаетесь в том, как работает NSString. NSString's initWithData:encoding: пытается интерпретировать байты данных, как если бы они были байтами строки в конкретной кодировке. Это противоположность dataUsingEncoding: NSString - вы можете позвонить 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]' you mean '((unsigned char *) [data bytes]) [i]'. –

+0

Более или менее. Исправлено, что я думал, что я написал в первую очередь. D'о. – Chuck

+0

Если вы уже используете оптимизированную производительность 'stringWithCapacity:', вы должны вычислить правильную емкость: '2 * [длина данных]'. –

Смежные вопросы