pugixml node_cdata, node_pcdata set_value() недопустимые символы
pugixml, кажется, добавляет недопустимые символы, когда я устанавливаю значение node_pcdata. Код ниже. То, что я пытаюсь сделать, это base-64 кодировать PNG и отправлять его через XML. Я записал кодированный в base-64 текст в файл, чтобы проверить его отдельно от pugixml, и он выглядит хорошо, заканчивая этими допустимыми символами 4AAAAASUVORK5CYII=
, Но ndAvatarData.set_value(avatarEnc)
вызов добавляет недопустимые символы для того же запуска 4AAAAASUVORK5CYII=
cY
3XA+Рz
, Иногда результат действителен, но я не смог повторить это, поэтому я не знаю, как выглядит вывод pugi в этом случае.
Есть ли что-то, что мне нужно сделать здесь? Это известная проблема с pugixml? Я искал, но не мог найти ничего обсуждающего эту проблему.
Я получаю это в Visual C++ 2010.
char* avatarEnc = NULL;
try {
std::ifstream avatarIn("MyAvatar.png", std::ios_base::in | std::ios_base::binary);
if (!avatarIn.is_open())
cerr << "Could not open avatar file!";
else {
base64::encoder E;
stringstream avatarOut;
E.encode(avatarIn, avatarOut);
avatarOut.seekg(0, ios::end);
int avatarEncSize = avatarOut.tellg();
avatarOut.seekg(0, ios::beg);
avatarEnc = new char[avatarEncSize];
avatarOut.read(avatarEnc, avatarEncSize);
std::ofstream tempOut("avatarEnc.txt", std::ios_base::out | std::ios_base::binary);
tempOut.write(avatarEnc, avatarEncSize);
xml_node ndAvatar = root.append_child("avatar");
xml_node ndAvatarData = ndAvatar.append_child(pugi::node_pcdata);
ndAvatarData.set_value(avatarEnc);
}
}
catch (...) {
cerr << "Error loading avatar.";
}
1 ответ
Разобрался - set_value() хочет завершить нулем строку.
avatarEnc = new char[avatarEncSize+1];
avatarOut.read(avatarEnc, avatarEncSize);
avatarEnc[avatarEncSize] = 0;