我有:
std::string string = "\xae\xab\xe30"
(在“\ xe30”序列继续之后)。
在iOS设备上为音乐文件创建指纹后,此数据来自echoprint-ios库。该字符串包含zlib
- 压缩base64
序列。
UPD:有时这个字符串可以包含.$\x18\x8a\x03
这样的数据,我也需要你的答案。
我需要:
将此字符串解析为NSString*
并将其传递给NSURL
以对echoprint服务进行查询。
出了什么问题:
我无法通过很多方法解析NSString*
std::string
对象:
通过[NSString stringWithCString:string.c_str() encoding:NSUTF8StringEncoding]
创建NSString对象 - 它在UTF8上返回nil
,就像我需要的那样但是使用UTF16 / 32编码的数据不正确(但这绝对是错误的,它应该是ascii / utf8 string imo),或者使用NSAsciiStringEncoding,它会在NSString对象数据中放置不可读的符号(例如来自系统符号表)。
任何获取输入标准c-string的方法(因此它将是string.c_str()
)
恢复
我需要帮助将此字符串转换为NSString对象。
答案 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个字节。所以确实存在错误,编译器是对的!