我正在使用Google协议缓冲区通过Google Play游戏服务iOS SDK在cocos2d-x多人游戏中发送和接收数据。
[协议缓冲区将数据转换为std :: string,但是GPGS iOS sdk通过NSData发送数据,因此,我必须先从std :: string转换为NSData,然后在接收数据后再转换回std :: string。
我目前正在使用以下方法:
(std :: string到NSData和NSData to std :: string将在不同的时间在不同的函数中完成。以下代码仅概述了我的整体工作]]
//PlayerData is protocol buffer class
PlayerData data, temp;
std::string dataStr;
data.SerializeToString(&dataStr);
NSString* nsDataStr = [NSString stringWithCString:dataStr.c_str()
encoding:[NSString defaultCStringEncoding]];
NSData* nsData = [nsDataStr dataUsingEncoding:NSUTF8StringEncoding];
NSString* dataStr_2 = [[NSString alloc] initWithData:nsData
encoding:NSUTF8StringEncoding];
std::string foo = [dataStr_2 UTF8String];
temp.ParseFromString(foo);
序列化后的初始字符串,即dataStr
“ \ r \ x95n \ x99D \ x158 \ xddNDJ \ nUmar SaeedR \ x12p_CPH64oqq2K-TXxAB”
size:42
最终字符串,即解析前的foo
“ \ r \ xc3 \ xafn \ xc3 \ xb4D \ x158 \ xe2 \ x80 \ xbaNDJ \ nUmar SaeedR \ x12p_CPH64oqq2K-TXxAB”
size:46
协议缓冲区的ParseFromString函数不会解析foo并返回false。
如何进行字符串转换,以使字符串保持不变?
我知道这很旧,但是...您能用protobufs ParseFromArray代替ParseFromString吗?
IE
const void *bytes = [parseData bytes];
int byteLen = (int)[parseData length];
protobufMessage.ParseFromArray(bytes, byteLen);
只是一个想法。