如何将 std::string 转换为 NSData ,反之亦然?
Posted
技术标签:
【中文标题】如何将 std::string 转换为 NSData ,反之亦然?【英文标题】:how to convert std::string to NSData and vice versa? 【发布时间】: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" 【参考方案1】:我知道这是旧的,但是...你能用 protobufs ParseFromArray 代替 ParseFromString 吗?
IE
const void *bytes = [parseData bytes];
int byteLen = (int)[parseData length];
protobufMessage.ParseFromArray(bytes, byteLen);
只是一个想法。
【讨论】:
【参考方案2】:试试这个:
std::string str = "123";
NSData *data = [NSData dataWithBytes:str.data() length:str.length()];
【讨论】:
以上是关于如何将 std::string 转换为 NSData ,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?
如何将 System::String^ 转换为 std::string?