我的问题如下。我想在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
并没有完全按照我的预期行事。你有什么提示吗?提前谢谢。
答案 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()
特别好,因为您可以完全避免内存复制操作。这主要是为了传统支持,我不会跳过使用它,但有时它很方便。