C++ 解析二进制 plist

Posted

技术标签:

【中文标题】C++ 解析二进制 plist【英文标题】:C++ Parse Binary plist 【发布时间】:2014-02-20 04:41:34 【问题描述】:

我正在用 C++ 编写一个需要解析二进制 plist 的程序。 XML 解析不是问题,所以我想我可以将二进制 plist 转换为 XML,然后解析它。有没有办法在 C++ 中原生地做到这一点?我知道苹果的plutil 具有此功能,但从程序中执行该功能似乎是一种不好的做法。

我正在运行最新版本的 OS X (10.9)

【问题讨论】:

我在 github 上找到了这个:github.com/animetrics/PlistCpp 还有libplist:cgit.sukimashita.com/libplist.git @InsertNameHere 这些很棒,但是有什么方法可以在不下载任何内容的情况下做到这一点? 【参考方案1】:

假设您想在苹果平台上执行此操作,您可以使用 CFPropertyListCreateFromStream、CFPropertyListCreateWithData 或 CFPropertyListCreateWithStream,它们是 CoreFoundation 框架的一部分: 所有这些函数都有以下参数:

format:指定属性列表格式的常量。有关可能的值,请参阅属性列表格式。

CFPropertyListCreateFromStream 也有以下参数:

stream:数据包含内容的流。流必须打开和配置——这个函数只是从流中读取字节。流可能包含任何受支持的属性列表类型(请参阅属性列表格式)。

The CFProperty constants definition 定义如下:

enum CFPropertyListFormat 
    kCFPropertyListOpenStepFormat = 1,
    kCFPropertyListXMLFormat_v1_0 = 100,
    kCFPropertyListBinaryFormat_v1_0 = 200
;
typedef enum CFPropertyListFormat CFPropertyListFormat;

这往往表明上面提到的方法实际上可以读取二进制 plist。 二进制 plist 实现细节也已由 Apple here 开源。

苹果还有一些sample code,其中的小号是:

CFDataRef resourceData;
SInt32 errorCode;
Boolean status = CFURLCreateDataAndPropertiesFromResource(
           kCFAllocatorDefault, fileURL, &resourceData,
           NULL, NULL, &errorCode);

if (!status) 
    // Handle the error

// Reconstitute the dictionary using the XML data
CFErrorRef myError;
CFPropertyListRef propertyList = CFPropertyListCreateWithData(
                      kCFAllocatorDefault, resourceData, kCFPropertyListImmutable, NULL, &myError);

// Handle any errors
CFRelease(resourceData);
CFRelease(myError);

【讨论】:

以上是关于C++ 解析二进制 plist的主要内容,如果未能解决你的问题,请参考以下文章

C++ 十六进制解析

二进制plist结构

使用 Python 读取二进制 Plist 文件

有没有可以读写plist文件的Java库,包括二进制格式?

Xcode 是不是将 plist 隐式转换为二进制格式?

供应配置文件中 plist 周围的二进制数据是啥?