NSData和NSString转换不相等

时间:2016-07-08 11:32:46

标签: objective-c nsstring nsdata

所以我从网络获得了一个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>

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

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

我得到了:

  

"!\ XC2 \ X93 \ 0 \ 0 \ 0 \ x02macid \ 0)\ 0 \ 0 \ 02f5672cb76691b989bbd2022a5349939a2d7b952 \ 0 \ x02ifa \ 0 \ 0 \ 0 \ 07188aa4015254d7c9abe2bbb2caee7b9 \ 0 \ x02ifv \ 0 \ 0 \ 0 \ 0a04f5078bc804443bdcd17e6f42e980c \ 0 \ nuuid \ 0 \ 0"

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

  

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>

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

2 个答案:

答案 0 :(得分:1)

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

@"\xc2\x93\0\0\0\x02macid\0)\0\0\02f5672cb76691b989bbd2022a5349939a2d7b952\0\x02ifa\0!\0\0\07188aa4015254d7c9abe2bbb2caee7b9\0\x02ifv\0!\0\0\0a04f5078bc804443bdcd17e6f42e980c\0\nuuid\0\0"

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

答案 1 :(得分:1)

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