2012-06-28 3 views
1

내 문제는 다음과 같습니다. NSMutableData 객체에 NSString을 캡슐화하고 싶습니다. 하지만 다른 항목과 함께 그리고 NSData에 캡슐화하지 않고 함께하고 싶습니다. 그것은 결국 바이트가 아닙니다.NSString NSData로 변환없이 NSString

내 최종 NSMutableData 개체는 header는 문자이고 stringLength가 서명되지 않은 짧은

[header | stringLength | NSString] 

처럼 보일 것입니다. 나는이

unsigned short stringLength = myString.length; 
NSMutableData* nData = [NSMutableData dataWithBytes:(const void*)&header length:sizeof(char)]; 
[nData appendBytes:(const void*)&dataLength length:sizeof(unsigned short)]; 
[nData appendBytes:(const void*)myString length:stringLength]; 

처럼 내 패킷이 내가 다음 gkSession 이상이를 보낼 것이고, 다른 쪽 끝에서 나는 고통의 아이폰에 다음 문자열 자체 추출 할 것이다 구축 : 몇 가지 이유를 들어

NSString* temp = [NSString alloc]; 
[data getBytes:(void*)&temp range:NSMakeRange(sizeof(char)+sizeof(unsigned short), stringLenght)]; 

를이 나에게 나쁜 메모리 접근을주고있다. 나는 myString.length이 내가 기대하는 바를 정확하게 수행하지 못하고 있다고 생각합니다. 어떤 힌트가 있습니까? 미리 감사드립니다.

답변

1

이 줄 올바르지 않습니다

[nData appendBytes:(const void*)myString length:stringLength]; 

이것은 (보다 큰 stringLength이다) NSString 기본 구조의 첫 번째 부분을 코딩한다.

은 무엇을 의미하는 것은 :

[nData appendBytes:[myString UTF8String] 
      length:[myString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; 

length 문자의 수입니다. 이는 멀티 바이트 문자의 바이트 수보다 상당히 작을 수 있습니다.

길이를 1 바이트 (0-255)로 줄이면 해당 인코딩을 파스칼 문자열이라고하며 CFString은 해당 인코딩을 기본적으로 처리 할 수 ​​있습니다 (CFStringGetPascalString() 참조). 당신이 일반적으로하고 싶은 것은 아니지만 흥미 롭습니다. CFStringCreateWithPascalStringNoCopy()으로 특히 좋습니다. 메모리 복사 작업을 완전히 피할 수 있기 때문입니다. 이것은 주로 레거시 지원을위한 것이며, 나는 그것을 사용하기 위해 모든 농구를 뛰어 넘지는 않겠지 만 때로는 편리합니다.

+0

감사합니다. Rob! 이 시점의 다음 질문은 다음과 같습니다. 어떻게 문자열을 안전하게 언팩 할 수 있습니까? UTF8String으로 포장했지만,'[data getBytes : (void *) tmpString range : NSMakeRange (rangeBegin, rangeLength)];'를 할 때 다른 쪽에서 중단 신호를 받는다. 나는'tmpString'을'NSMutableString * tmpString = [NSMutableString stringWithCapacity : rangeLength];'로 선언했다. 어쩌면 인코딩 때문일까? 'tmpString'을 채우려는 인코딩의 종류는 무엇입니까? – ticofab

+1

나는 길을 찾은 것 같아요 : 먼저 일반 버퍼의 모든 것을 덤프하고 '[[NSString alloc] initWithBytes : (const void *) 버퍼 길이 : dL 인코딩 : NSUTF8StringEncoding];'을 사용하여 원래 문자열을 다시 가져옵니다. 도와 주셔서 다시 한 번 감사드립니다! – ticofab