有没有办法以TypedStream格式读取文件

Jor*_*ter 10 file objective-c next data-structures

我有一个以下格式的文件:

NeXT/Apple typedstream data, little endian, version 4, system 1000
Run Code Online (Sandbox Code Playgroud)

在十六进制编辑器看着它,它明确提出了NS的一些对象(NSArray,NSValue,等).它似乎也有一个嵌入式plist!

我猜测有一种直接的方式来读取这个文件并以更可读的方式输出它(类似于repr()或的输出print_r()).

我假设我需要使用Objective-C做到这一点?

Ari*_*riX 10

首先,一些历史:

较旧版本的Objective-C运行时(OS X之前版本)包含一个名为NXTypedStream的伪类,它是NSCoder的OPENSTEP前祖先.旧版本的Foundation包含一个名为NSCompatibility.h的头文件,它具有处理旧的NeXTStep格式的功能和类别.NSCompatibility.h不再存在,但仍可在NSCoder.h中找到该功能的(已弃用)子集.

NSCoder作为OPENSTEP中原始Foundation Kit的一部分首次亮相,但可能使用typedstreams作为其序列化格式.在某些时候,它被切换到基于plist的格式.当前版本的Interface Builder(作为Xcode的一部分)仍然能够读取较旧的基于类型流的NIB,这是OS X中仍然存在此功能的一个很好的线索.

现在,解决方案:

我在任何(当前的)Apple文档中都找不到这个,但事实证明NSCoder/NSUnarchiver仍然可以正常读取typedstream文件.如果要在Cocoa/Objective-C程序中读取typedstream文件,只需执行以下操作:

NSUnarchiver *typedStreamUnarchiver = [[NSUnarchiver alloc] initForReadingWithData:[NSData dataWithContentsOfFile:@"<path to your typedstream file>"]];
Run Code Online (Sandbox Code Playgroud)

而已!解码在一个名为_decodeObject_old的函数内部处理.现在您可以使用标准NSCoder方法取消归档,例如:

id object = [typedStreamUnarchiver decodeObject];
NSLog(@"Decoded object: %@", object);
Run Code Online (Sandbox Code Playgroud)

请注意,如果typedstream中的类不是程序中的有效类,则会抛出NSArchiverArchiveInconsistency异常.

另见:http://www.stone.com/The_Cocoa_Files/Legacy_File_Formats.html


lem*_*nar 4

plutil如果它是一个二进制 plist,那么使用 Xcode / Plist Editor、或者您自己的 Objective-C 代码应该很容易读取它。否则,根据文件的不同,这可能会更具挑战性。该文件存储 Objective-C 对象的序列化表示。因此,它仅供创建它的软件读取。

  • 二进制 plist 以神奇的“bplist00”开头。类型化流似乎以“�streamtyped”开头。我想没有针对类型化对象流的通用反序列化工具? (4认同)