Есть ли способ читать файлы в формате TypedStream - PullRequest
10 голосов
/ 07 декабря 2010

У меня есть файл в следующем формате:

NeXT/Apple typedstream data, little endian, version 4, system 1000

Глядя на него в шестнадцатеричном редакторе, он явно состоит из NS чего-то объектов (NSArray, NSValue, так далее).Похоже, что он также имеет встроенный plist!

Я предполагаю, что есть простой способ прочитать этот файл и вывести его более читабельным способом (аналогично выводу repr() или print_r()).

Полагаю, мне нужно будет сделать это с помощью Objective-C?

Ответы [ 2 ]

10 голосов
/ 27 февраля 2013

Сначала немного истории:

Более старые версии среды выполнения Objective C (до OS X) включали псевдо-класс с именем NXTypedStream , который является предком NSCoder до OPENSTEP. Более ранние версии Foundation содержали заголовок NSCompatibility.h , в котором были функции и категории для работы со старыми форматами NeXTStep. NSCompatibility.h больше не существует, но (не рекомендуется) подмножество этой функциональности все еще можно найти в NSCoder.h.

NSCoder дебютировал как часть оригинального Foundation Kit в OPENSTEP, но, вероятно, использовал типизированные потоки в качестве формата сериализации. В какой-то момент он был переведен в формат на основе plist. Текущая версия Интерфейсного Разработчика (как часть XCode) все еще в состоянии читать более старые, основанные на typedstream NIBs, который является хорошим признаком, что эта функциональность все еще существует в OS X.

Теперь решение:

Я не могу найти это ни в одной (текущей) документации Apple, но оказывается, что NSCoder / NSUnarchiver все еще может читать файлы типизированного потока просто отлично. Если вы хотите прочитать файл typedstream в программе Cocoa / Objective-C, просто сделайте это:

NSUnarchiver *typedStreamUnarchiver = [[NSUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:@"<path to your typedstream file>"]];

Вот и все! Декодирование выполняется внутри функции _decodeObject_old. Теперь вы можете разархивировать, используя стандартные NSCoder методы, такие как:

id object = [typedStreamUnarchiver decodeObject];
NSLog(@"Decoded object: %@", object);

Обратите внимание, что если класс в typedstream не является допустимым классом в вашей программе, он выдаст исключение NSArchiverArchiveInconsistency.

Смотри также: http://www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html

4 голосов
/ 31 мая 2011

Если это бинарный список, его легко прочитать с помощью Xcode / Plist Editor, plutil или вашего собственного кода Objective-C.В противном случае, в зависимости от файла, это может быть более сложным.Файл хранит сериализованное представление объектов Objective-C.Таким образом, он предназначен для чтения только той программой, которая его создала.

...