如何将std :: string转换为NSData,反之亦然?

问题描述 投票:1回答:1

我正在使用Google协议缓冲区通过Google Play游戏服务iOS SDK在cocos2d-x多人游戏中发送和接收数据。

[协议缓冲区将数据转换为std :: string,但是GPGS iOS sdk通过NSData发送数据,因此,我必须先从std :: string转换为NSData,然后在接收数据后再转换回std :: string。

我目前正在使用以下方法:

std :: string到NSDataNSData 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。

如何进行字符串转换,以使字符串保持不变?

ios c++11 cocos2d-x google-play-games cocos2d-x-3.0
1个回答
0
投票

我知道这很旧,但是...您能用protobufs ParseFromArray代替ParseFromString吗?

IE

const void *bytes = [parseData bytes];
int byteLen = (int)[parseData length];

protobufMessage.ParseFromArray(bytes, byteLen);

只是一个想法。

© www.soinside.com 2019 - 2024. All rights reserved.