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

我最后的NSMutableData对象看起来像

[header | stringLength | NSString]


其中header是一个字符,而stringLength是一个无符号的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发送此消息,在另一端,我将提取字符串长度,然后提取字符串本身:

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


由于某些原因,这给了我不好的内存访问权限。我怀疑并没有完全符合我的期望。你有什么提示吗?提前致谢。

最佳答案

这行是不正确的:

[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()尤其好,因为您可以完全避免进行内存复制操作。这主要是为了获得旧版支持,我不会一any而就地使用它,但是有时它很方便。

关于iphone - 将NSString转换为NSMutableData,而无需转换为NSData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11244378/

10-10 10:44