iphone - NSString 转换为 NSMutableData 而不转换为 NSData

标签 iphone ios nsstring nsdata gksession

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

我最终的 NSMutableData 对象看起来像这样

[header | stringLength | NSString]

其中 header 是一个字符,stringLength 是一个无符号短整型。 我这样构建我的数据包

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 字符串,并且 CFString 可以本地处理该编码(请参阅 CFStringGetPascalString())。不是您通常想做的事情,而是有趣的事情。它特别适用于 CFStringCreateWithPascalStringNoCopy(),因为您可以完全避免内存复制操作。这主要用于遗留支持,我不会跳过任何障碍来使用它,但有时它很方便。

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

相关文章:

html - 无法使用 loadHTMLString :baseURL in iOS? 在 UIWebView 中加载 html 字符串

iphone - 如何防止点击屏幕上的某个区域

html - 为什么 iOS Safari 中的滚动条位于粘性元素后面?

ios - 跨 iOS 版本稳定的 String 哈希值?

ios - 如何在应用程序中存储图像(来自画廊/相机)以便稍后调用?

iphone - 如何在不占用整个屏幕的情况下录制视频

iphone - 如何获取html文件的一部分?

ios - 关于为什么这个 Swift 代码不能编译的任何想法?

ios - 将十进制 NSString 转换为十六进制字符串

iphone - iphone safari 中的背景图像未正确显示