我有一个包含一些二进制数据的字符串。字符串为xml格式,因此在进行处理之前,我需要将二进制数据转换为base64格式。
我正在使用一个名为findXMLTag的函数,该函数将在给定包含数据的xml标记的情况下查找数据的开始和结束位置。
现在,我能够将数据转换为base64,但是我在用新的base64数据替换旧的二进制数据时遇到了问题。

事实是,我不能使用任何类型的字符串,因为当它找到一个空字符时,它将把它视为字符串的终止点,但是实际上,由于我在字符串中存储了二进制数据,因此该空字符可以成为字符串的一部分我的二进制数据。

所以我想我正在寻找某种二进制替代品,我不知道如何使它工作。
在此先感谢您提供的任何帮助。

这是我用来在xml字符串中定位数据的开始和结束的代码。

std::vector<TForm1::Pair> TForm1::findXMLTag(char *XMLString, char* XMLTag, int XMLSize)
{
    void *found = XMLString;
    int XMLTagLen = strlen(XMLTag);
    std::vector<TForm1::Pair> result;
    TForm1::Pair pair;
    AnsiString XMLTagEnd = "</";
    XMLTagEnd += &XMLTag[1];

    while(found = memmem(XMLString, XMLSize - ((char*)found - XMLString), XMLTag, XMLTagLen))
    {
        if(found == NULL)
            return result;

        found = (char*)found + XMLTagLen;

        pair.start = int((char*)found - XMLString);

        found = memmem(found, XMLSize - ((char*)found - XMLString), XMLTagEnd.c_str(), XMLTagEnd.Length());

        pair.end = int((char*)found - XMLString);

        found = (char*)found + XMLTagEnd.Length();

        result.push_back(pair);
    }

    return result;
}

最佳答案

将您的C风格答案转换为C ++,我们得到了一种单行代码,该单行代码是安全的(对于有效索引),高效且易读:

std::string binary_replace(
    std::string const& bin, unsigned bin_start, unsigned bin_end,
    std::string const& replace_with
) {
    assert(bin_start < bin.size() and bin_end < bin.size());
    return bin.substr(0, bin_start) + replace_with + bin.substr(bin_end);
}


为此,可以使用replace function使其变得更加简单:

std::string binary_replace(
    std::string bin, unsigned bin_start, unsigned bin_end,
    std::string const& replace_with
) {
    assert(bin_start < bin.size() and bin_end < bin.size());
    return bin.replace(bin_start, bin_end - bin_start, replace_with);
}


(请注意,由于bin对其进行了修改,因此此处按值传递了replace。)

本质上,可以直接替代C ++中的大多数C字符串函数-在这种情况下,请查看documentation of std::basic_string::substr

10-05 22:27
查看更多