macos — C ++ Parse Binary plist

Я пишу программу на C ++, которая должна будет анализировать двоичные списки. Синтаксический анализ XML не является проблемой, поэтому я подумал, что могу преобразовать двоичный plist в XML, а затем проанализировать его. Есть ли способ сделать это изначально в C ++? Я знаю это яблоко plutil имеет такую ​​возможность, но выполнение этого из программы кажется плохой практикой.

Я использую последнюю версию OS X (10.9)

2

Решение

Предполагая, что вы хотите сделать это на платформе Apple, вы можете использовать CFPropertyListCreateFromStream, CFPropertyListCreateWithData или же CFPropertyListCreateWithStream, которые являются частью платформы CoreFoundation:
Все эти функции имеют следующий аргумент:

Формат: константа, которая определяет формат списка свойств. См. Форматы Списка свойств для возможных значений.

CFPropertyListCreateFromStream также имеет следующий аргумент:

Поток: поток, данные которого содержат контент. Поток должен быть открыт и настроен — эта функция просто читает байты из потока. Поток может содержать любой поддерживаемый тип списка свойств (см. Форматы списка свойств).

Определение констант CFProperty определяет следующее:

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

Это имеет тенденцию указывать, что методы, упомянутые выше, могут фактически читать двоичные списки.
Детали реализации двоичного списка также были получены от Apple. Вот.

У Apple есть кое-что еще образец кода, худой из которых является:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]