pugixml node_cdata, node_pcdata set_value () недопустимые символы - PullRequest
1 голос
/ 21 января 2012

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 Ответ

1 голос
/ 21 января 2012

Разобрался - set_value () хочет завершить нулем строку.

avatarEnc = new char[avatarEncSize+1];

avatarOut.read(avatarEnc, avatarEncSize);

avatarEnc[avatarEncSize] = 0;
...