0

バイナリデータを含む文字列があります。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;
}
4

3 に答える 3

1

これは、あなたを助けるかもしれない小さな自己完結型の例です. エラーや境界のチェックは行われないことに注意してください。これは概念を説明するためのものです。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// stub for real base64_encode
std::string base64_encode(const string &data)
{
    return "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
}

// search without terminating on NULL
size_t binary_find(const string &str, size_t offset, const string &s)
{
    for (size_t i=offset; i<str.length(); i++)
        if (str.compare(i, string::npos, s) == 0)
            return i;
    return string::npos;
}

int main()
{
    string tag = "<data>";
    string endtag = "</data>";
    string xml("<data>\0\0\0\0\0\0\0\0\0\0</data>", 23);
    size_t start = xml.find(tag) + tag.length();
    size_t end = binary_find(xml, start, endtag);
    string binary = xml.substr(start, end-start);
    string base64 = base64_encode(binary);
    xml.replace(start, end-start, base64);
    cout << xml << endl;
}
于 2013-10-21T23:49:18.533 に答える
-1
char *binary_replace(char *binString,  int _strlen, int binDataStart, int binDataEnd, char* replaceWith)
{
    char *buffer = (char*)malloc( (strlen(replaceWith)+(_strlen - (binDataEnd-binDataStart)))*sizeof(char) );

    memcpy(buffer, binString, binDataStart);

    strcat(buffer, replaceWith);

    memmove(buffer+binDataStart+strlen(replaceWith), binString+binDataEnd, _strlen - binDataEnd);

    return buffer;
}

これはC ++ではないことは知っていますが、問題は解決しました。

于 2013-10-21T22:41:01.040 に答える