2012-04-16 3 views
13

Я искал. Но все равно не получилось.NSData to NSString возвращает Null

Я конвертирую NSdata в NSString. Когда я делаю [data description]; он возвращает меня < 00000000 31323334 35363738> Да, я получаю мою строку @ "12345678".

Как его правильно преобразовать в NSString? Я попытался

NSString *b = [NSString stringWithUTF8String:[data bytes]]; 
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; 

И возвращает меня нулевой. Любая идея? Thanks

Привет всем, Спасибо за все предложения. Он, как представляется, является постоянным, когда всегда существует нулевой символ infront. Итак, всякий раз, когда я что-то получаю, я просто удаляю первый < 00000000>, тогда его рабочий тон уже

+0

Поиск в SO даст вам ответ – SomaMan

+0

привет, как я могу принять ответ людей? Я попытался щелкнуть ключ вверх, но он говорит, что мне нужно больше 15 репутации. – user774150

ответ

26

Это происходит, если кодировка неверна.

Попробуйте использовать ASCII для тестирования. ASCII почти наверняка работает, чтобы извлечь somekind строки. Если это только цифры, это, вероятно, сработает.

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

Наиболее часто, кроме UTF-8 enconding является:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

попробовать их и посмотреть, если они работают.

+1

NSASCIIStringEncoding работал для меня. Спасибо. –

6

Я конвертирую NSdata в NSString. Когда я делаю [описание данных]; это возвращает меня < 00000000 31323334 35363738> Да, я получаю мою строку @ "12345678".

Нет - вы не получаете эту строку. Вы получаете последовательность байтов, которая начинается с пучка значений 0x00, и за ней следует серия байтов, которые соответствуют последовательности ASCII «12345678».

I.e. у вас есть необработанные данные и они пытаются преобразовать его в ограниченный тип, но не могут, потому что ограниченный тип не может представлять необработанные данные.

Вы можете попробовать использовать API-интерфейсы с потерей преобразования в NSString, но это может не работать и будет хрупким в любом случае.

Лучшая ставка?

Преобразуйте только байты в NSData, которые фактически представляют строку для экземпляра NSString. Это можно сделать с помощью -initWithBytes:length:encoding:; вам нужно будет выполнить вычисления, чтобы найти правильное смещение и длину.

2

Возможно, это связано с тем, что первые байты ваших данных равны 00. Символ 0 - это конец символа строки. При создании строки из ASCII (из массива символов или массива байтов, как вы это делаете), когда символ 0 встречается в начале, он создает пустую строку.

Я бы ожидал, что он вернет экземпляр NSString с 0 символами, а не null.

+1

То, что строка завершается символом «0x00», верна только в том случае, если она является строкой C. Для других типов строк они часто представлены как тройка кодирования, длины и данных. Это имеет место в NSString; 0x00 не обманывают это, думая, что строка завершена, они вызывают ошибку, потому что 0x00 - это бессмысленная последовательность байтов внутри строки. – bbum

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