Iphone NSString转换为NSMutableData,而不转换为NSData

Iphone NSString转换为NSMutableData,而不转换为NSData,iphone,ios,nsstring,nsdata,gksession,Iphone,Ios,Nsstring,Nsdata,Gksession,我的问题如下。我想将NSString封装在NSMutableData对象中。但是我想和其他项目一起做,而不是先将其封装到NSData中。毕竟只有字节,不是吗 我的最后一个NSMutableData对象看起来像 [header | stringLength | NSString] 其中,header是字符,stringLength是无符号短字符。 我像这样构建我的包 unsigned short stringLength = myString.length; NSMutableData* nDa

我的问题如下。我想将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];
然后,我将通过GK会话发送此消息,在另一端,我将提取刺痛长度,然后提取字符串本身:

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()
特别好,因为您可以完全避免内存复制操作。这主要是为了传统支持,我不会为了使用它而跳过任何障碍,但有时它很方便。

这句话不正确:

[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()
特别好,因为您可以完全避免内存复制操作。这主要是为了传统支持,我不想使用它,但有时它很方便。

谢谢Rob!我在这一点上的下一个问题是:如何安全地打开字符串?我将其打包为UTF8String,但当我简单地执行
[data getBytes:(void*)tmpString range:NSMakeRange(rangeBegin,rangeLength)]时,另一侧会收到一个中止信号。我将
tmpString
声明为
NSMutableString*tmpString=[nsmutablestringwithcapacity:rangeLength]。可能是因为编码的原因吗?
tmpString
希望填充什么类型的编码?我想我找到了一种方法:首先将所有内容转储到通用缓冲区中,然后使用“[[NSString alloc]initWithBytes:(const void*)缓冲区长度:dL编码:NSUTF8StringEncoding];”返回原始字符串。再次感谢你的帮助!谢谢你,罗布!我在这一点上的下一个问题是:如何安全地打开字符串?我将其打包为UTF8String,但当我简单地执行
[data getBytes:(void*)tmpString range:NSMakeRange(rangeBegin,rangeLength)]时,另一侧会收到一个中止信号。我将
tmpString
声明为
NSMutableString*tmpString=[nsmutablestringwithcapacity:rangeLength]。可能是因为编码的原因吗?
tmpString
希望填充什么类型的编码?我想我找到了一种方法:首先将所有内容转储到通用缓冲区中,然后使用“[[NSString alloc]initWithBytes:(const void*)缓冲区长度:dL编码:NSUTF8StringEncoding];”返回原始字符串。再次感谢你的帮助!