2016-07-08 5 views
0

Таким образом я получил объект NSData из сети, как:NSData и NSString преобразования не равна

< 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 3 6363931 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>

Как вы можете видеть, первый раздел изменяется. Как я могу сохранить то же самое?

ответ

1

0x93 находится за пределами диапазона ASCII, используйте кодировку текста, который также учитывает значения>0x7F например NSMacOSRomanStringEncoding

+0

Я думаю, что это все еще строка, потому что a04f5078bc804443bdcd17e6f42e980c - это мой идентификатор устройства, поэтому я думаю, что имеет смысл – Wingzero

+0

как узнать кодировку? – Wingzero

+0

@Wingzero Если это не проблема с кодировкой, это может быть проблема с тем, как вы сначала получаете объект NSData. – Larme

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, или, возможно, это даже не строка в кодировке в первом место. Чтобы получить правильную строку, вам нужно знать ее кодировку (это часто предоставляется, например, как метаданные с веб-серверов). Как только вы узнаете правильную кодировку, вы можете создать допустимую строку и затем сгенерировать другие кодировки из этой строки.

+0

Я думаю, что это все еще строка, потому что a04f5078bc804443bdcd17e6f42e980c мой идентификатор устройства, так что я думаю, что это имеет смысл – Wingzero

+0

как сделать Я знаю кодировку? – Wingzero

+0

Просто потому, что вы можете распознавать строки в данных, не означает, что все данные являются строкой. Вам следует указать кодировку, когда строка отправлена ​​вам. – Droppy