【问题标题】:escaped std::string to NSString*将 std::string 转义为 NSString*
【发布时间】:2014-03-04 13:23:18
【问题描述】:

我有:

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

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

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

我需要:

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

怎么了:

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

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

  2. 输入标准 c 字符串的任何方法(因此它将是 string.c_str()

简历:

我需要帮助将这个字符串翻译成 NSString 对象。

【问题讨论】:

  • 你检查过 echoprint 站点中的 iOS 示例吗?
  • 正是这样 iOS 示例和所有其他示例(试图在 google、yandex 甚至 bing 上找到它们) - 他们都将 c string 转换为 NSString* 但所有互联网都是旧示例。对于 iOS 6/7,它不起作用。

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


【解决方案1】:
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()];

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

【讨论】:

  • 是的,我之前的尝试和您的示例是正确的。我也尝试通过 NSData 等获得正确的值,但它只是不需要 - 字符串总是包含无效数据。所以不是我的尝试,不是你的例子可以提供帮助。这是 c++-objective-c 问题。
  • @VictorPolevoy 我已经包含了忽略 utf8 约束的数据方法。
  • 你,其实是对的,但我不知道该接受哪个答案。我敢打赌,因为我的解决了问题的根源,但你的也是我问题的答案。所以我想最好接受我的帮助人们知道如何解决 echoprint-ios-example 的问题。
  • @VictorPolevoy 绝对接受你的答案,如果它是正确的答案。
  • @GradyPlayer 只是一个小修正:NSString 认为 NUL 是一个有效字符,并且绝对可以包含它。
【解决方案2】:

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

我不敢相信这个字符串一直都是正确的,而且我是对的——这是垃圾。 Codegen-class 的 C++ 对象一直不正确。

很好地解释了这个问题here

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

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

【讨论】:

    【解决方案3】:

    我忘了检查明显,e30(16)相当于3632(10)。这个值显然超过了 256,可以装进 8 个字节。所以确实有错误,编译器是对的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 2011-04-02
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多