2013-07-17 3 views
0

Я получаю поток символов NSData длиной не менее 50 символов. Обычно я пытаюсь преобразовать это в NSString и использовать селектор subStringFromIndex:, но кажется, что NSString завершает NULL (исправьте меня, если я ошибаюсь), и я предпочел бы пропустить преобразование данных/строк. Кто-нибудь знает, есть ли способ получить charecter по определенному индексу в NSData? Например, говорят, что данные возвращаемые:NSData subStringFromIndex: Equivalent

<12345678 9abcdefg hjiklmno> 

Позволяет сказать, что я хотел бы получить и 8 из 7, и одна только те два. Чтобы получить 7 и 8, я попытался сделать что-то вроде этого:

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(7, -19)]; 

Работает как очарование. Но проблема в том, что поток всегда будет другой длины. Это может быть 100 символов, или это может быть 50, но я всегда знаю, что два значения, которые мне нужны, расположены на 42-м и 43-м месте. Кто-нибудь имеет пример или знает лучший способ сделать это?

ответ

2

Интересно, что ваш код с отрицательной длиной не падает.

Чтобы получить два байта в положении 42, 43, просто используйте

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(42, 2)]; 
+0

Большое спасибо. Да, я поставил там несколько условностей, чтобы предотвратить крушение, но это, безусловно, было до этого! Еще раз спасибо. – John

+0

@ Джон: Добро пожаловать! –

1

Почему вы хотите, чтобы пропустить преобразование в NSString?

Строка, которую вы получаете, кодируется как NSData. В зависимости от кодировки каждый символ будет представлен как один или несколько байтов. Если он кодируется UTF8, некоторые символы будут представлены в виде одного байта, а другие символы будут представлены двумя или более байтами.

По этой причине, если вы хотите, чтобы ваш код был надежным и обрабатывал разные кодировки и различное строковое содержимое, вы должны сначала преобразовать NSData в NSString, а затем проиндексировать строку.

Если строка UTF-8 кодируются вы можете сделать следующее:

NSData *data = ... 
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSString *subString = [str substringFromIndex:... 

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

Как говорится: преждевременная оптимизация - это корень всего зла.

+0

Отличный человек, спасибо большое за вход. Позволь мне дать этот шанс очень быстро ... – John