13

次の形式のファイルがあります。

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

16 進エディタで見ると、明らかに NS の何かのオブジェクト ( NSArrayNSValueなど) で構成されています。また、plist が埋め込まれているようです。

このファイルを読み取って、より読みやすい方法で出力する簡単な方法があると思います(repr()またはの出力に似ていますprint_r())。

Objective-Cを使用してこれを行う必要があると思いますか?

4

2 に答える 2

11

まず、いくつかの歴史:

Objective-C ランタイムの古いバージョン (OS X より前) には、NSCoderの OPENSTEP 以前の祖先である NXTypedStreamと呼ばれる疑似クラスが含まれていました。古いバージョンの Foundation にはNSCompatibility.hというヘッダーが含まれていました。これには、古い NeXTStep 形式を処理するための関数とカテゴリが含まれていました。NSCompatibility.h はもう存在しませんが、その機能の (非推奨の)サブセットは NSCoder.h で引き続き見つけることができます。

NSCoder は OPENSTEP のオリジナルの Foundation Kit の一部としてデビューしましたが、おそらくシリアル化形式として typedstreams を使用していました。ある時点で、plist ベースの形式に切り替えられました。現在のバージョンの Interface Builder (Xcode の一部として) は、古い typedstream ベースの NIB を読み取ることができます。これは、この機能が 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

于 2013-02-26T21:40:38.013 に答える
4

plutilバイナリ plist の場合は、Xcode/Plist エディター、または独自の Objective-C コードで簡単に読み取ることができます。そうしないと、ファイルによっては、より困難になる可能性があります。このファイルには、Objective-C オブジェクトのシリアル化された表現が格納されます。そのため、それを作成したソフトウェアによってのみ読み取れるようになっています。

于 2011-05-30T21:02:50.410 に答える