繁体   English   中英

将NSString转换为NSMutableData,而无需转换为NSData

[英]NSString into NSMutableData without conversion to NSData

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

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

这行是不正确的:

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

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

您的意思是:

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

length是字符数。 这可以大大小于多字节字符的字节数。

只需注意一点:如果您可以将长度缩短到1个字节(0-255),则该编码称为Pascal String, CFString可以原生处理该编码(请参阅CFStringGetPascalString() )。 这不是您通常想要做的,但是很有趣。 CFStringCreateWithPascalStringNoCopy()尤其CFStringCreateWithPascalStringNoCopy() ,因为您可以完全避免执行内存复制操作。 这主要是为了获得旧版支持,我不会一any而就地使用它,但是有时它很方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM