我正在使用谷歌协议缓冲区将一些数据从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;
}
我的问题是,有时这不起作用。我可以看到我发送和接收所有字节,但转换时其中一些丢失了。所以例如我得到83个字节,但是当打印字符串时我得到大约20个字符。其余的在哪里?我不知道这种转换方法有什么问题吗?
答案 0 :(得分:1)
NSString是一个用于处理Unicode字符串的类。您不能像使用C字符串一样在其中存储任意字节。 (即便如此,您可能无法传输二进制数据来代替字符串并期望它能够在传输过程中存活)
您需要以导致有效文本字符串的方式将二进制数据转换为字符串。例如,通过Base64编码。
有许多iOS项目可以编码/解码Base64,只需google它。
以下是关于它的文章:http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html?m=1
答案 1 :(得分:0)
在obj-c中的堆栈上分配C数组有时会导致错误。 尝试为char数组使用动态内存:
char* raw = (char*)malloc(len*sizeof(char));
然后释放它:
free(raw);