我正在寫一個程序在C++中,將需要解析二進制plists。 XML解析不是問題,所以我想我可以將二進制plist轉換爲XML,然後解析它。有沒有辦法在C++本地執行此操作?我知道蘋果公司的plutil
具有這種功能,但是在程序中執行它似乎是不好的做法。C++解析二進制plist
我運行的是最新版本的OS X(10.9)
我正在寫一個程序在C++中,將需要解析二進制plists。 XML解析不是問題,所以我想我可以將二進制plist轉換爲XML,然後解析它。有沒有辦法在C++本地執行此操作?我知道蘋果公司的plutil
具有這種功能,但是在程序中執行它似乎是不好的做法。C++解析二進制plist
我運行的是最新版本的OS X(10.9)
假設你想這樣做,蘋果的平臺,您可以使用CFPropertyListCreateFromStream,CFPropertyListCreateWithData或CFPropertyListCreateWithStream,這是的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);
,我發現這個在GitHub上:https://github.com/animetrics/PlistCpp – jamespick
還有libplist:HTTP:// CGT文件.sukimashita.com/libplist.git/ – jamespick
@InsertNameHere這些都很好,但有沒有辦法做到這一點,而無需下載任何東西? – 735Tesla