NSString转换为NSMutableData而不转换为NSData

时间:2012-06-28 12:12:54

标签: iphone ios nsstring nsdata gksession

我的问题如下。我想在NSMutableData对象中封装NSString。但我想与其他项目一起完成,而不是先将其封装到NSData中。它毕竟只是字节不是吗?

我的最终NSMutableData对象看起来像

[header | stringLength | NSString]

其中header是char,stringLength是unsigned short。 我像这样构建我的数据包

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发送它,另一端我会提取sting lenght然后字符串本身:

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

由于某些原因,这给了我糟糕的内存访问。我怀疑myString.length并没有完全按照我的预期行事。你有什么提示吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

此行不正确:

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

这是对基础NSString结构的第一部分进行编码(大于stringLength)。

你的意思是:

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

length是字符数。这可能远远小于多字节字符的字节数。

正如旁注:如果您可以将长度缩短为1个字节(0-255),那么该编码称为Pascal字符串,而CFString可以本地处理该编码(请参阅CFStringGetPascalString() })。不是你一般想做的事,而是有趣的。它与CFStringCreateWithPascalStringNoCopy()特别好,因为您可以完全避免内存复制操作。这主要是为了传统支持,我不会跳过使用它,但有时它很方便。