2013-07-14 3 views
0

Следующий код: NSData Представление NSAppleEventDescriptor Я получаю как возврат вызова NSAppleScript. Что такое кодирование NSData блока и как я должен преобразовать его в NSString данныхNSAppleEventDescriptor encoding

< 646c6532 00000000 6c697374 00000174 00000000 00000000 00000018 6c697374 0000000c 00000000 75747874 00000008 0068006f 006d0065 75747874 0000001a 00540065 006d0070 00390033 00370033 00360030 00360031 00367574 78740000 001a0054 0065006d 00700032 00300037 00370030 00390033 00310033 75747874 00000018 00540065 006d0070 00390038 00380039 00340038 00310037 75747874 00540065 0000001a 006d0070 00330033 00350032 003 90030 00300031 00397574 78740000 001a0054 0065006d 00700035 00310039 00380039 00380030 00300032 75747874 0000001a 00540065 006d0070 00330030 00300036 00310038 00320031 00387574 78740000 000a0044 00610076 00690064 75747874 00000010 0055006e 00740069 0074006c 00650064 75747874 0000000c 00700067 00690073 00680061 75747874 0000001a 00540065 006d0070 00380038 00390038 00370038 00330034 00357574 78740000 001a0054 0065006d 00700035 00380038 00360038 00320035 00300037>

Большое спасибо, Дэвид

+0

Как правило, вы конвертируете NSAppleEventDescriptor обратно в эквивалентный объект object-c. Например, строка applescript может быть преобразована в NSString. Список массива, запись в словарь и т. Д. Поэтому вам нужно рассказать нам больше о applescript и том, что возвращается из applescript, прежде чем мы сможем помочь. – regulus6633

ответ

0

Используйте -[NSAppleEventDescriptor stringValue] - это будет принуждать AEDesc к типу UnicodeText, если он еще не один, и распакуйте его как NSString (иначе он вернет нуль, если он не может быть принудительно).

Вы не ковыряться в -[NSAppleEventDescriptor data], если вам не нужно декодировать один из типов АИ (например, typeLongDateTime), для которых NSAppleEventDescriptor не обеспечивает удобство пакета/распаковку методу, но именно так лжет безумие.

Если ваш код AppleScript является частью вашего приложения, а не предоставленным пользователем сценарием, рассмотрите возможность использования AppleScript-ObjC вместо NSAppleScript. Как и PyObjC и RubyCocoa, ASOC создает объекты сценария AppleScript как обычные классы и экземпляры Cocoa для остальной части вашей программы и автоматически преобразует общие значения AS в их эквиваленты какао, когда они пересекают мост, поэтому он намного проще и эффективнее.

+0

Оказалось, что блок кодируется в кодировке: NSUTF16LittleEndianStringEncoding, что имеет смысл, поскольку Mac использует процессоры Intel. Многие, спасибо, Дэвид –

+0

Вы делаете абсолютно небезопасное предположение. Apple Event Manager определяет типы дескрипторов для кодировок _several_ Unicode (UTF8, UTF16BE, UTF16LE), а также ряд устаревших кодировок, отличных от Unicode. Опять же, не связывайтесь с методом -data. Используйте -stringValue для получения NSString, поскольку он будет выполнять все необходимые проверки и преобразования типов для вас. В слабой системе динамического типа, такой как AEM, ответственность за код получателя заключается в том, чтобы принудить возвращаемое значение к типу, который он действительно требует, а не делать слепые предположения о том, каков его первоначальный тип. – foo

+0

Я просмотрю свой код. Большое спасибо, Дэвид –