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