2014-01-28 150 views
2

我正在寫一個程序在C++中,將需要解析二進制plists。 XML解析不是問題,所以我想我可以將二進制plist轉換爲XML,然後解析它。有沒有辦法在C++本地執行此操作?我知道蘋果公司的plutil具有這種功能,但是在程序中執行它似乎是不好的做法。C++解析二進制plist

我運行的是最新版本的OS X(10.9)

+1

,我發現這個在GitHub上:https://github.com/animetrics/PlistCpp – jamespick

+1

還有libplist:HTTP:// CGT文件.sukimashita.com/libplist.git/ – jamespick

+1

@InsertNameHere這些都很好,但有沒有辦法做到這一點,而無需下載任何東西? – 735Tesla

回答

5

假設你想這樣做,蘋果的平臺,您可以使用CFPropertyListCreateFromStreamCFPropertyListCreateWithDataCFPropertyListCreateWithStream,這是的CoreFoundation框架的一部分上:
所有這些函數具有以下參數:

format:一個常量,指定屬性列表的格式。查看可能的值的屬性列表格式。

CFPropertyListCreateFromStream還具有以下參數:

流:數據流,其數據包含的內容。該流必須打開並配置 - 該功能只是從流中讀取字節。該流可能包含任何受支持的屬性列表類型(請參閱屬性列表格式)。

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);