我的问题是以下。我想将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/