2012-04-16 4 views
13

검색했습니다. 그러나 아직도 couldnt 한 그것을 얻는다.NSData to NSString에서 Null을 반환합니다.

NSString을 NSString으로 변환 중입니다. 내가 할 때 [data description]; 그것은 나를 돌려 준다 < 00000000 31323334 35363738> 예, Im는 "12345678"이라는 문자열을 받는다.

NSString으로 변환하려면 어떻게해야합니까? 나는

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

모두 나 null을 반환했습니다. 아이디어가 있으십니까? 감사합니다.

안녕하세요, 모든 제안 주셔서 감사합니다. null 문자가 항상 infront 상수로 나타납니다. 그래서 내가 뭔가를받을 때마다, 처음에는 < 00000000>을 제거하고, 그 다음 벌금은 이미

+0

SO에서 검색하면 – SomaMan

+0

안녕하세요, 어떻게 사람들의 답변을 수락합니까? 나는 위로 키를 클릭하려고했지만 15 개 이상의 평판이 필요합니다. – user774150

답변

26

인코딩이 잘못된 경우에 발생합니다.

ASCII를 사용하여 테스트 해보십시오. ASCII는 문자열의 일부를 검색하는 작업을 거의 확실히 수행합니다. 그것이 유일한 숫자라면 그것은 아마도 효과가있을 것입니다. UTF-8 enconding 제외

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

가장 일반적인 은 다음과 같습니다

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

그들을 밖으로 시도하고 작동되는지 확인합니다.

+1

NSASCIIStringEncoding이 나를 위해 일했습니다. 고맙습니다. –

6

NSString을 NSString으로 변환 중입니다. [데이터 설명]을 할 때; 그것 는 나를 돌려 준다 < 00000000 31323334 35363738> 예, 내 문자열을받는 중 @ "12345678".

아니요 - 해당 문자열을받지 못했습니다. 0x00 값으로 시작하여 ASCII 시퀀스 "12345678"에 해당하는 일련의 바이트가 뒤에 오는 바이트 시퀀스를 수신하고 있습니다.

e.e. 원시 데이터를 가졌으나이를 제한 유형으로 변환하려하지만 제한 유형이 원시 데이터를 나타내지 못하기 때문에 선택할 수 없습니다.

NSString에서 "손실이있는 변환"API를 사용해 볼 수도 있지만 작동하지 않을 수 있으며 어쨌든 약할 수 있습니다.

최상의 선택?

문자열을 실제로 나타내는 NSData의 바이트 만 NSString의 인스턴스로 변환하십시오. 그것은 -initWithBytes:length:encoding:으로 할 수 있습니다; 올바른 오프셋과 길이를 찾기 위해 계산을해야합니다.

2

데이터의 첫 번째 바이트가 00이기 때문일 수 있습니다. 문자 0은 문자열 문자의 끝입니다. ASCII 배열 (문자 배열 또는 바이트 배열)에서 문자 0을 처음에 발견하면 빈 문자열을 생성합니다.

그러나 null이 아닌 NSString의 인스턴스를 0 문자로 반환 할 것으로 기대합니다.

+1

문자열이 '0x00'으로 끝나는 것은 C 문자열 인 경우에만 true입니다. 다른 문자열 유형의 경우 인코딩, 길이 및 데이터의 세 가지로 표현되는 경우가 많습니다. 이것은 NSString의 경우입니다. 0x00은 문자열이 종료되었다고 생각해서는 안되며 0x00은 문자열 내에서 의미없는 바이트 시퀀스이기 때문에 오류가 발생합니다. – bbum