将std :: string转义为NSString *

时间:2014-03-04 13:23:18

标签: c++ ios objective-c string nsstring

我有:

std::string string = "\xae\xab\xe30"(在“\ xe30”序列继续之后)。

在iOS设备上为音乐文件创建指纹后,此数据来自echoprint-ios库。该字符串包含zlib - 压缩base64序列。

UPD:有时这个字符串可以包含.$\x18\x8a\x03这样的数据,我也需要你的答案。

我需要:

将此字符串解析为NSString*并将其传递给NSURL以对echoprint服务进行查询。

出了什么问题:

我无法通过很多方法解析NSString* std::string对象:

  1. 通过[NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]创建NSString对象 - 它在UTF8上返回nil,就像我需要的那样但是使用UTF16 / 32编码的数据不正确(但这绝对是错误的,它应该是ascii / utf8 string imo),或者使用NSAsciiStringEncoding,它会在NSString对象数据中放置不可读的符号(例如来自系统符号表)。

  2. 任何获取输入标准c-string的方法(因此它将是string.c_str()

  3. 恢复

    我需要帮助将此字符串转换为NSString对象。

3 个答案:

答案 0 :(得分:2)

std::string string = "\xae\xab\xe30";
NSString * cocoaString = [NSString stringWithFormat:@"%s",string.c_str()];

NSString * cocoaString = [NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding];

请记住,在c ++中,你可以在字符串中保留空字符...但是在NSString中不会被视为有效,如果需要保留任意数据,NSData对象将更好地工作。

数据示例:

NSData * d = [NSData dataWithBytes:(void *) string.c_str() length:string.length()];

这将封装任意二进制数据而不考虑格式。

答案 1 :(得分:1)

在阅读完所有网站,论坛,博客文章等后,我想我已经找到了上述问题的原因。

我简直不敢相信这个字符串是正确的,我是对的 - 这是垃圾。 Codegen的C ++对象 - 类始终不正确。

很好地解决了这个问题here

codegen的这个问题我通过将类修改为objective-c ++类来解决。 我的原始echoprint-ios-example的分叉here.随意获取并使用它。

还发送了对父存储库的拉取请求。

答案 2 :(得分:0)

我忘了检查明显,e30(16)相当于3632(10)。该值显然大于256,可以容纳8个字节。所以确实存在错误,编译器是对的!