1

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

我最终的 NSMutableData 对象看起来像

[header | stringLength | NSString]

whereheader是一个 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 长度,然后是字符串本身:

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

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

4

1 回答 1

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(),因为您可以完全避免内存复制操作。这主要用于遗留支持,我不会跳过任何箍来使用它,但有时它很方便。

于 2012-06-28T13:02:29.543 回答