2015-01-14 6 views
1

메서드를 항상 사용하고 있기 때문에 NSData 범주에 NSData-NSString 변환이 있습니다. 그러나이 대답에 따르면 https://stackoverflow.com/a/2467856/1231948은 그렇게 간단하지 않습니다.UTF-8로 인코딩 된 NSData에 Null로 끝나는 문자열이 포함되어 있는지 확인

- (NSString *) stringValue 
{ 
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; 
} 

을 지금까지 그것을 :

지금까지, 나는 같은 이름의 메소드로부터 문자열을 반환하는 다른 데이터 객체의 메소드와 일치 유지하기위한 노력의 일환으로, 내 NSData 카테고리에서이 방법을 성공하지만, 문자열 응답 링크에서도, 널 (null)로 종료되는, 내가 대신이 방법을 사용할지 여부를 결정하는 경우 내가 결정하고 싶습니다 : UTF-8 NSData 인코딩 된 경우

NSString* str = [NSString stringWithUTF8String:[data bytes]]; 

어떻게 확인합니까 널 용어를 포함한다. inated string?


아래의 답을 얻고 난 후에, 나는 나의 NSData 분류 방법에 대한 stringValue을 더 철저하게 구현을 썼습니다 :

- (NSString *) stringValue 
{ 
    //Determine if string is null-terminated 
    char lastByte; 
    [self getBytes:&lastByte range:NSMakeRange([self length]-1, 1)]; 

    NSString *str; 

    if (lastByte == 0x0) { 
     //string is null-terminated 
     str = [NSString stringWithUTF8String:[self bytes]]; 
    } else { 
     //string is not null-terminated 
     str = [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; 
    } 

    return str; 
} 
+0

어디에서 데이터를 가져 왔습니까? 데이터가 null로 끝나는 경우 변수 또는 신비가되어서는 안됩니다. 예를 들어 UTF-8로 인코딩되었음을 확신 할 수 있습니다. 프로토콜이 지시하는 것이 무엇이든지 그것이 널 종료인지 여부를 결정해야합니다. (예를 들어 null로 끝나는 것이 아닌지 확신하지 못한다면, 널로 끝나는 여러 문자열의 순서가 아니라는 것을 어떻게 확신 할 수 있습니까? 아니면 null로 구분 된 여러 문자열, 약간 다릅니다.) –

+0

저는 확신을 주려고하지는 않지만 오히려 일반성입니다. 저는 다양한 상황에서 데이터를 처리 할 수있을 정도로 견고한 솔루션을 개발하려고합니다. 맞습니다. 두 가지 이유로 UTF-8로 제한됩니다. 1) UTF-8은 온라인 (80 % 이상)에서 가장 널리 사용되는 문자 인코딩이며 W3C에서 다음과 같은 언어의 표준 인코딩으로 권장됩니다. HTML과 XML, 2) 대부분의 경우 UTF-8이 표준이기 때문에 두 번째 매개 변수로 인코딩을 사용하는 별도의 메소드로 다른 인코딩 처리를 예약하고자합니다. 이는 Java API가 나중에 설계된 방식입니다 버전. – Sheamus

답변

3

null 종결은 문자 그대로 마지막 바이트의 값이 0임을 의미합니다. 다음을 확인하는 것이 쉽습니다.

char lastByte; 
[myNSData getBytes:&lastByte range:NSMakeRange([myNSData length]-1, 1)]; 
if (lastByte == 0x0) { 
    // string is null terminated 
} else { 
    // string is not null terminated 
} 
0

그래서 당신은, 당신의 NSData의 마지막 바이트는 널 여부를 확인하는 방법을 기원 모든 바이트 (bytes)에 대한 포인터를 얻는 방법과 (length) 얼마나 많은 지 알아야합니다.

C에서

는 "포인터 모든 바이트에"배열로 사용 색인, 그래서 당신은 사용 마지막 바이트를 얻을 수 있습니다 할 수 있습니다 : 당신이되는 null로 끝나는 문자열을 지원해야하는 경우

Byte *theBytes = data.bytes; 
Byte lastByte = theBytes[bytes.length - 1]; 

짧아지면 전체 버퍼를 스캔해야합니다. 마지막에 멈추는 것을 잊지 마십시오 (따라서 strlen 같은 것을 사용하지 마십시오).

initWithBytes:length:encoding:을 사용하여 질문에서 두 가지 방법 중 하나를 사용하지 않고 NSString을 구성하려는 경우 null을 확인하면 바이트 포인터와 길이 포인터를 얻게됩니다.

HTH