NSData 和 NSString 转换不相等

NSData and NSString conversion not equal

所以我从网络上得到了一个 NSData 对象,比如:

<93000000 026d6163 69640029 00000032 66353637 32636237 36363931 62393839 62626432 30323261 35333439 39333961 32643762 39353200 02696661 00210000 00373138 38616134 30313532 35346437 63396162 65326262 62326361 65653762 39000269 66760021 00000061 30346635 30373862 63383034 34343362 64636431 37653666 34326539 38306300 0a757569 640000>

现在我想看看使用encoding:NSASCIIStringEncoding的字符串是什么:

[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]

我得到:

"\xc2\x93[=14=][=14=][=14=]\x02macid[=14=])[=14=][=14=]f5672cb76691b989bbd2022a5349939a2d7b952[=14=]\x02ifa[=14=]![=14=][=14=]188aa4015254d7c9abe2bbb2caee7b9[=14=]\x02ifv[=14=]![=14=][=14=][=14=]a04f5078bc804443bdcd17e6f42e980c[=14=]\nuuid[=14=][=14=]"

注意:这个字符串对我来说很有意义,因为

a04f5078bc804443bdcd17e6f42e980c

我的设备标识符是从

获得的

[UIDevice currentDevice].identifierForVendor]

现在我想把它转换回 NSData:

[str dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]

<13000000 026d6163 69640029 00000032 66353637 32636237 36363931 62393839 62626432 30323261 35333439 39333961 32643762 39353200 02696661 00210000 00373138 38616134 30313532 35346437 63396162 65326262 62326361 65653762 39000269 66760021 00000061 30346635 30373862 63383034 34343362 64636431 37653666 34326539 38306300 0a757569 640000>

如您所见,第一部分已更改。如何保持不变?

这不是有效的字符串(例如,它包含 NUL 个字符):

@"\xc2\x93[=10=][=10=][=10=]\x02macid[=10=])[=10=][=10=]f5672cb76691b989bbd2022a5349939a2d7b952[=10=]\x02ifa[=10=]![=10=][=10=]188aa4015254d7c9abe2bbb2caee7b9[=10=]\x02ifv[=10=]![=10=][=10=][=10=]a04f5078bc804443bdcd17e6f42e980c[=10=]\nuuid[=10=][=10=]"

很明显数据没有使用 ASCII 编码,或者它可能根本就不是编码字符串。为了获得正确的字符串,您需要知道它的编码(例如,这通常作为 Web 服务器的元数据提供)。一旦知道了正确的编码,就可以生成有效的字符串,然后从该字符串生成其他编码。

0x93 超出了 ASCII 范围,使用也考虑值 > 0x7F 的文本编码,例如 NSMacOSRomanStringEncoding