2010-12-06 54 views
9

我有以下格式的文件:有沒有辦法讀取文件TypedStream格式

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

在十六進制編輯器看着它,它顯然是由NS 東西對象(NSArrayNSValue等)。它也似乎有一個嵌入式plist!

我猜這裏有一個直接的方式來讀取這個文件並以一些更可讀的方式輸出它(類似於repr()print_r()的輸出)。

我假設我需要使用Objective-C來做到這一點?

回答

4

如果是二進制plist,應該很容易用Xcode/Plist編輯器,plutil或您自己的Objective-C代碼讀取它。否則,根據文件,這可能會更具挑戰性。該文件存儲Objective-C對象的序列化表示。因此,它只能被創建它的軟件讀取。

+1

是的,這是我的想法。幸運的是,文件格式已被更改爲XML,使其不僅更具可讀性,而且實際上是*人可讀*。 – 2011-05-31 04:32:34

8

首先,一些歷史:Objective-C運行(預OS X)的

舊版本包括一個僞類稱爲NXTypedStream,這是NSCoder的OPENSTEP預祖先。較早版本的Foundation包含一個名爲NSCompatibility.h的頭文件,它具有處理舊NeXTStep格式的函數和類別。 NSCompatibility.h不再存在,但該功能的(不建議使用的)subset仍可在NSCoder.h中找到。

NSCoder作爲OPENSTEP中原始基礎套件的一部分首次亮相,但可能使用typedstreams作爲其序列化格式。在某些時候,它被轉換爲基於plist的格式。當前版本接口生成器(如Xcode中的一部分)仍然能夠讀取舊的,基於typedstream-發鈔銀行,這是一個很好的線索,這個功能還是在OS X存在現在

,解決方法:

我無法在任何(當前)Apple文檔中找到它,但事實證明,NSCoder/NSUnarchiver仍然可以讀取typedstream文件。如果你想在Cocoa/Objective-C程序中讀取typedstream文件,只需執行以下操作:

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

相關問題