将流字节转换为字符串 我使用谷歌协议缓冲区从C++服务器发送一些数据到iOS应用程序。我在IOS端使用此函数将流字节转换为字符串: -(NSString*)convertStreamBytesToString:(NSMutableData*)data { int len = [data length]; char raw[len]; [data getBytes:raw length:len]; NSString *protocStruct =[[NSString alloc] initWithBytes:raw length:len encoding:NSUTF8StringEncoding]; return protocStruct; }

将流字节转换为字符串 我使用谷歌协议缓冲区从C++服务器发送一些数据到iOS应用程序。我在IOS端使用此函数将流字节转换为字符串: -(NSString*)convertStreamBytesToString:(NSMutableData*)data { int len = [data length]; char raw[len]; [data getBytes:raw length:len]; NSString *protocStruct =[[NSString alloc] initWithBytes:raw length:len encoding:NSUTF8StringEncoding]; return protocStruct; },ios,objective-c,Ios,Objective C,我的问题是,有时这不起作用。我可以看到我发送和接收了所有字节,但在转换时,其中一些字节丢失了。例如,我得到83个字节,但当打印字符串时,我得到大约20个字符。其余的在哪里?这种转换方法是否存在我不知道的问题?在obj-C中的堆栈上分配C数组有时会导致错误。 尝试对字符数组使用动态内存: char* raw = (char*)malloc(len*sizeof(char)); 然后释放它: free(raw); NSString是一个用于处理Unicode字符串的类。不能像使用C字符串一样在其

我的问题是,有时这不起作用。我可以看到我发送和接收了所有字节,但在转换时,其中一些字节丢失了。例如,我得到83个字节,但当打印字符串时,我得到大约20个字符。其余的在哪里?这种转换方法是否存在我不知道的问题?

在obj-C中的堆栈上分配C数组有时会导致错误。 尝试对字符数组使用动态内存:

char* raw = (char*)malloc(len*sizeof(char));
然后释放它:

free(raw);

NSString是一个用于处理Unicode字符串的类。不能像使用C字符串一样在其中存储任意字节。(即使这样,您也可能无法传输二进制数据来代替字符串,并期望它在传输过程中幸存下来)

您需要将二进制数据转换为字符串,从而生成有效的文本字符串。例如,通过Base64编码

有很多iOS项目可以对Base64进行编码/解码,只需谷歌一下


这里有一篇关于它的文章:

你是否尝试过
NSASCIIStringEncoding
而不是
NSUTF8StringEncoding
?@CaptJak:是的,结果相同它们都是可打印字符吗?你应该使用base64编码/解码来实现这一点。纯二进制数据可能并不总是有效的UTF-8@MarcusAdams:是的,我从服务器得到的是一个从xml文件检索数据的结构,直到得到相同的问题这不是问题所在。问题是无法将原始字节转换为NSString——它必须是具有有效文本编码的数据。