2016-10-18 9 views
1

통해 NSInputStream으로는 NSString을 인코딩 한 후 변경 NSStringNSString 등 ->NSData ->NSInputStream하고 read 방법 NSInputStream에서 디코딩 :바이트 인코딩 도중 I는 다음과 같은 문제는 실행을 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); 

출력 255 대신 195입니다. 왜?

답변

1

문자열에 사용 된 인코딩 종류 때문에. UTF-8은 문자열 인코딩 형식으로 127 이상의 값을 갖는 문자를 멀티 바이트 시퀀스로 변환합니다. 따라서 inputString에는 단일 문자가 포함되어 있지만 실제로는 데이터 객체에 단일 바이트가 포함되지 않았지만 여러 바이트 (이 경우 2 바이트)가 포함되었습니다. 그리고 스트림에서 읽을 때 인코딩 된 데이터의 첫 번째 바이트 만 읽었지만 그 이상이 더 있습니다.

이 결과를 보려면 입력 스트림을 통해 데이터를 실행할 필요가 없습니다. NSData 인스턴스의 첫 번째 바이트에 액세스하면 같은 결과가 나타납니다.

당신은 이것이 "문제"라고 말하지만 실제로 성취하려는 것을 제안하지는 않습니다. 255는 인쇄 가능/의미있는 텍스트 문자가 아닙니다. 원시 데이터 바이트를 전송하려면 NSString 및 문자열 인코딩을 사용하는 대신 직접 수행 할 수 있습니다. 문자열을 전송하는 경우 이미 올바른 작업을 수행하고 있습니다. 데이터 크기가 문자열 "길이"를 초과 할 수 있도록 준비해야합니다.

+1

TIL, 설명해 주셔서 감사합니다! 그것은 단위 테스트의 일부이고'XCTAssertEqual ((int) bytes, 255);와 같은 것을 기대하고있었습니다. – yvetterowe

+0

문제 없습니다. 어쩌면 이것은 도움이되지 않을 수도 있습니다. 행운을 빕니다. –