2010-12-06 8 views
9

J'ai un fichier dans le format suivant:Est-il possible de lire des fichiers au format TypedStream

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

regardant dans un éditeur hexadécimal, il est clairement composé de NS quelque chose objets (NSArray , NSValue, etc.). Il semble également avoir une plist intégré!

Je suppose qu'il existe un moyen simple de lire ce fichier et de le sortir de façon plus lisible (similaire à la sortie de repr() ou print_r()).

Je suppose que je vais devoir faire cela en utilisant Objective-C?

Répondre

4

S'il s'agit d'un plist binaire, il devrait être facile de le lire avec Xcode/Plist Editor, plutil, ou votre propre code Objective-C. Sinon, selon le fichier, cela pourrait être plus difficile. Le fichier stocke une représentation sérialisée des objets Objective-C. En tant que tel, il est uniquement destiné à être lisible par le logiciel qui l'a créé.

+1

Ouais, c'est ce que je pensais. Heureusement, le format de fichier a été changé en XML, ce qui le rend non seulement plus lisible, mais réellement * lisible par l'homme *. –

+4

Le plist binaire commence avec la magie "bplist00". Le flux typé semble commencer par "<0x04><0x0b> streamtyped". Je suppose qu'il n'y a pas d'outil de désérialisation générique pour les flux d'objets typés? – jkj

8

Tout d'abord, un peu d'histoire:

anciennes versions du moteur d'exécution Objective-C (pré-OS X) comprend une classe appelée pseudo-NXTypedStream, qui est l'ancêtre pré-OPENSTEP de NSCoder. Les anciennes versions de Foundation contenaient un en-tête appelé NSCompatibility.h, qui comportait des fonctions et des catégories permettant de gérer les anciens formats NeXTStep. NSCompatibility.h n'existe plus, mais un (obsolète) subset de cette fonctionnalité peut encore être trouvé dans NSCoder.h. NSCoder a fait ses débuts en tant que partie du Kit de base d'origine dans OPENSTEP, mais a probablement utilisé des flux typés comme format de sérialisation. À un certain moment, il a été basculé sur un format basé sur le plist. La version actuelle de Interface Builder (dans le cadre de Xcode) est toujours capable de lire plus âgés, BNR à base TypedStream, ce qui est un bon indice que cette fonctionnalité existe encore dans OS X.

Maintenant, la solution:

Je ne le trouve dans aucune documentation (actuelle) d'Apple, mais il s'avère que NSCoder/NSUnarchiver peut toujours lire les fichiers de type typedriver. Si vous voulez lire un fichier TypedStream dans un programme Cocoa/Objective-C, faire ceci:

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

Ca y est! Le décodage est géré en interne dans une fonction appelée _decodeObject_old. Maintenant, vous pouvez désarchiver en utilisant NSCoder méthodes standard, comme:

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

Notez que si la classe dans la TypedStream n'est pas une classe valide dans votre programme, il jette une exception NSArchiverArchiveInconsistency.

Voir aussi: http://www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html

Questions connexes