2010-12-06 17 views
9

Ich habe eine Datei in folgendem Format zu lesen:Gibt es eine Möglichkeit in Dateien in TypedStream Format

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

Betrachtet man es in einem Hex-Editor, ist es klar aus der NS etwas Objekten (NSArray , NSValue, usw.). Es scheint auch einen eingebetteten Plist zu haben!

Ich vermute, es gibt eine einfache Möglichkeit, diese Datei zu lesen und in einer besser lesbaren Art und Weise auszugeben (ähnlich der Ausgabe von repr() oder print_r()).

Ich nehme an, ich muss dies mit Objective-C tun?

Antwort

4

Wenn es sich um ein Binärplot handelt, sollte es leicht mit dem Xcode/Plist Editor, plutil oder Ihrem eigenen Objective-C-Code gelesen werden können. Andernfalls könnte es je nach Datei schwieriger sein. Die Datei speichert eine serialisierte Darstellung von Objective-C-Objekten. Daher soll es nur von der Software gelesen werden können, die es erstellt hat.

+1

Ja, das ist, was ich dachte. Glücklicherweise wurde das Dateiformat in XML geändert, was es nicht nur lesbarer macht, sondern tatsächlich * für Menschen lesbar *. –

+4

Binär plist beginnt mit der Magie "bplist00". Getippter Stream scheint mit "<0x04><0x0b> Streamtyped" zu beginnen. Ich denke, es gibt kein generisches Deserialisierungswerkzeug für typisierte Objektströme? – jkj

8

Zuerst etwas Geschichte:

Ältere Versionen der Objective-C-Laufzeit (Pre-OS X) enthalten eine Pseudo-Klasse NXTypedStream genannt, die die Pre-OPEN Vorfahren des NSCoder ist. Ältere Versionen von Foundation enthielten einen Header namens NSCompatibility.h, der Funktionen und Kategorien für den Umgang mit alten NeXTStep-Formaten enthielt. NSCompatibility.h existiert nicht mehr, aber ein (veraltet) subset dieser Funktionalität kann noch in NSCoder.h gefunden werden.

NSCoder debütierte als Teil des ursprünglichen Foundation Kit in OPENSTEP, verwendete aber wahrscheinlich typedstreams als Serialisierungsformat. Irgendwann wurde es auf ein plistenbasiertes Format umgestellt. Die aktuelle Version von Interface Builder (als Teil der Xcode) ist noch in der Lage älter, typedstream-basierte NIBs zu lesen, das ist ein guter Anhaltspunkt ist, dass diese Funktionalität noch existiert in OS X.

nun die Lösung:

Ich kann dies in keiner (aktuellen) Apple-Dokumentation finden, aber es stellt sich heraus, dass NSCoder/NSUnarchiver immer noch typedstream-Dateien gut lesen kann. Wenn Sie eine Datei in einem typedstream Cocoa/Objective-C-Programm lesen möchten, tun nur dies:

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

Das ist es! Die Decodierung wird intern in einer Funktion namens _decodeObject_old behandelt. Jetzt können Sie mit Standard NSCoder Methoden aus dem Archiv entfernen, wie:

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

Beachten Sie, dass, wenn die Klasse in der typedstream in Ihrem Programm keine gültige Klasse ist, wird es eine NSArchiverArchiveInconsistency Ausnahme auslösen.

Siehe auch: http://www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html

Verwandte Themen