Интерпретация iOS / Какао / данных с помощью NSString initWithData для построения строки сводит меня с ума - PullRequest
0 голосов
/ 25 сентября 2011

У меня очень простой обратный вызов, который вызывается, когда HTTP-запрос только что был завершен через объект NSURLConnection (connectionDidFinishLoading). Этот код просто превращает необработанные 7-битовые кодированные данные, считанные из удаленного файла, в строку NSString.

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString *string = [[NSString alloc] initWithData:mReceivedData encoding:NSASCIIStringEncoding];

NSLog(@"string = %@", string);
}

Проблема в том, что строка NIL. Затем я заподозрил плохое преобразование из-за наличия плохих байтов (> 0x80), но все мои прочитанные байты являются чисто 7-битовыми закодированными данными ASCII:

(gdb) po mReceivedData

<2366696c 65566572 73696f6e 0a310a23 66696c65 54797065 0a626964 4465660a 23657865 72636973 654c6576 656c0a31 0a23636f 6c756d6e 54657874 0a537564 2f4f7565 73742f4e 6f72642f 4573740a 23636f6c 756d6e43 6f6c6f72 0a677265 656e2f72 65642f67 7265656e 2f726564 0a236269 6456616c 7565730a 2a2f3144 2f582f2d 0a3f2f2a 2f2a2f2a 0a2a2f2a 2f2a2f2a 0a2a2f2a 2f2a2f2a 0a236164 76696365 4c696e65 310a5370 6f75746e 696b2028 52c3a970 6f6e6461 6e740a23 61647669 63654c69 6e65320a 617072c3 a8732069 6e746572 76656e74 696f6e0a 2368616e 64436172 64730a4a 2f392f36 2f350a38 2f350a41 2f580a4b 2f372f36 2f332f32 0a237363 6f726547 7269640a 32532f31 300a3343 2f360a31 532f330a 32432f30 0a23616e 73776572 436f6d6d 656e7473 0a32532f 4f75693a 20646520 3820c3a0 20313020 706f696e 74732065 74203420 63617274 657320c3 a020532e 0a33432f 5072696f 726974c3 a920c3a0 206c6120 6d6f7965 6e6e652e 0a31532f 436f6d6d 65206176 6563207a c3a9726f 20706f69 6e74203f 0a32432f 4168206e 6f6e2021 0a236d61 696e436f 6d6d656e 740a4c65 20636f6d 6d6 56e74 61697265 20646520 4d696368 656c2042 65737369 732e0a0a 456e2072 c3a9706f 6e736520 61752063 6f6e7472 652064e2 80996170 70656c2c 20696c20 66617574 20646f6e 6e657220 6c652070 6c65696e 20646520 7361206d 61696e2e 20416e6e 6f6e6365 72203153 206d6f6e 74726572 61697420 64652030 20c3a020 3720706f 696e7473 202872c3 a9706f6e 73652066 6f7263c3 a965292e 0a0a4963 692c2069 6c206661 75742073 61757465 7220c3a0 2032532c 20656e63 68c3a872 65207175 69206e65 2070726f 6d657420 70617320 63696e71 20636172 74657320 65742071 75692064 69742075 c3a96372 6e206a65 75206465 203820c3 a0203130 20706f69 6e747320 482028c3 a0207061 72746972 20646520 31312070 6f696e74 732c2063 e2809965 73742075 6e206375 652d6269 64206f75 20756e20 73617574 20c3a020 6c61206d 616e6368 65207175 69207365 72612063 686f6973 69292e>

Эти необработанные данные в точности совпадают с байтами, содержащимися в удаленном файле, поэтому не существует загрязняющих байтов.

Я также пытался играть с преобразованием UTF-8, но это все та же проблема.

У меня есть другой способ сделать это: построить строку C из этих необработанных данных и создать NSString с чем-то вроде NSStringWithCString ... но я считаю, что это очень уродливо, и я действительно хотел бы использовать API-интерфейс Cocoa предназначен для такой цели. Нет никаких причин, по которым я не смогу использовать силу какао для выполнения такой основной задачи.

Я что-то пропускаю?

Большое спасибо, Franz

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

Иногда GDB не ваш друг.

po строка не работает и говорит:

(gdb) po строка Невозможно получить доступ к переменной "string" Не удается напечатать описаниеобъект NIL.

Но если я напечатаю его с помощью

NSLog (@ "string =% @", string);

, тогда он будет правильно напечатан, и строка содержитакцентированные символы ... и фактически файл правильно декодируется при использовании параметра NSUTF8StringEncoding:

NSString *string = [[NSString alloc] initWithData:mReceivedData encoding:NSUTF8StringEncoding];

NSLog(@"string = %@", string);

Трудно поверить, что GDB может предоставлять ошибочную информацию о строке.Я только наполовину удовлетворен этим объяснением.Я хотел бы понять, почему GDB предоставляет такую ​​информацию о строке.

РЕДАКТИРОВАТЬ: я наконец установил действие «Выполнить» для отладки вместо выпуска по продукту -> Управление схемами, и отладочная информация должным образом отображается GDB.

0 голосов
/ 25 сентября 2011

Несмотря на ваше упорство, что

Все показанные здесь 7-битные байты имеют значения <0x80 </p>

быстрый взгляд показывает байты 0x99 0xa8 0xa9 0xc3 0xa0 0xe2 и более. Так что это не действительно ascii, закодированный как 8-битные байты.

Если это действительно 7-битные значения (не каждое закодировано в 8-битном байте), то строка не начинается

# файл

как вы предлагаете, но

Yj-

Что я не думаю, что вы ожидаете.

Похоже, ваш файл не является ascii или не передается как ascii. В любом случае ваши проблемы начинаются до того, как они попадут в Какао.

...