【发布时间】:2015-01-03 07:21:58
【问题描述】:
我正在使用 google 协议缓冲区通过 Google Play Games Services iOS sdk 在 cocos2d-x 多人游戏中发送和接收数据。
Protocol buffer 将数据转换为 std::string 但 GPGS iOS sdk 通过 NSData 发送数据,因此我必须在接收数据后从 std::string 转换为 NSData,然后再转换回 std::string。
我目前正在使用以下方法:
(std::string 到 NSData 和 NSData 到 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"
尺寸:42
解析前的最终字符串,即 foo
"\r\xc3\xafn\xc3\xb4D\x158\xe2\x80\xbaNDJ\nUmar SaeedR\x12p_CPH64oqq2K-TXxAB"
尺寸:46
protocol buffer的ParseFromString函数不解析foo,返回false。
如何进行字符串转换以使字符串保持不变?
【问题讨论】:
-
不确定从 c 字符串创建 std::string 时是否会自动发生这种情况(应该),但值得考虑:“UTF8String:此 C 字符串是指向字符串对象内部结构的指针,它的生命周期可能比字符串对象短,而且肯定不会有更长的生命周期。因此,如果需要将 C 字符串存储在使用此属性的内存上下文之外,则应复制它。"
-
nsDataStr 和 dataStr_2 是相同的还是已经不同了?
-
对不起,我没有真正明白你的要求。
-
好的,我现在明白了。 nsDataStr 和 dataStr 是相同的。我认为问题在于 std::string 到 NSString 之间的转换,反之亦然
-
nsDataStr=@"\rïnùX›NDJ\nUmar SaeedRp_CPH64oqq2K-TXxAB" dataStr_2=@"\rïnùX›NDJ\nUmar SaeedRp_CPH64oqq2K-TXxAB"
标签: ios c++11 cocos2d-x google-play-games cocos2d-x-3.0