2016-10-18 6 views
1

Я бег в следующих задачи при попытке кодирующей NSString, как NSString ->NSData ->NSInputStream, а затем декодировать из NSInputStream с read методом:Б изменяется после кодирования NSString в NSInputStream с помощью NSData

NSString *inputString = [NSString stringWithFormat:@"%c", 255]; 
NSData *data = [inputString dataUsingEncoding:NSUTF8StringEncoding]; 
NSInputStream *stream = [NSInputStream inputStreamWithData:data]; 
[stream open]; 
uint8_t bytes; 
[stream read:&bytes maxLength:1]; 
NSLog(@"%i", bytes); 

Выхода 195 вместо 255. Зачем?

ответ

1

Из-за типа кодировки, которую вы использовали для строки. UTF-8 представляет собой форму строкового кодирования, которая завершит преобразование символов со значениями выше 127 в многобайтовые последовательности. Итак, хотя inputString содержал один символ, ваш объект данных фактически не содержал один байт, как вы могли предположить, но несколько (два в этом случае) байтов. И когда вы читаете из потока, вы читаете только первый байт закодированных данных, но там было больше.

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

Вы говорите, что это «проблема», но вы не предлагаете то, что вы пытаетесь на самом деле выполнить. 255 не является печатным/значимым текстовым символом. Если вы хотите передать необработанные байты данных, вы можете сделать это напрямую, а не использовать кодировки NSString и string. Если вы передаете строки, то это уже делается правильно. Вам просто нужно быть готовым к тому, что размер ваших данных может превышать вашу длину строки.

+1

TIL, спасибо за объяснение! Это часть моего модульного теста, и я ожидал нечто вроде 'XCTAssertEqual ((int) bytes, 255);'. – yvetterowe

+0

Нет проблем. Похоже, что это просто бесполезный тест. Удачи. –