如何将 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 到 NSDataNSData 到 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 ,反之亦然?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::string 转换为 WCHAR

如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?

如何将 System::String^ 转换为 std::string?

如何将 std::string 转换为大写? [复制]

如何将 UCHAR 虚拟键代码转换为 std::string [重复]

如何将 std::string 转换为字节 [关闭]