0

いくつかのバイナリデータを含むbase64でエンコードされた文字列をデコードしようとしています。文字列に含まれる文字が1つだけの場合もあります。残念ながら、関数QByteArray :: fromBase64()は、より大きな入力文字列でのみ機能します。

このコードは、より大きな入力文字列に対して機能します。

QByteArray text = QByteArray::fromBase64("ykw8");

unsigned int val = 0;
for(int i = 0; i < text.length(); i++)
    val |= (text.data()[text.length() - i - 1] & 0xff)  << (i*8);

その後val、「ykw8」でエンコードされた正しいデータである13257788が含まれます。ただし、fromBase64()の引数として「u」を送信すると、結果の配列(text)のサイズは0になります。したがって、変数には0valも含まれますが、46である必要があります。

入力文字列、つまり「u ==」などをパディングしようとしましたが、のサイズtextは常に0でした。では、fromBase64()で短い文字列を正しくデコードするにはどうすればよいですか?

4

2 に答える 2

1

base64でエンコードされた結果として「u」を使用することを主張する場合、最も近い有効なbase64は「uA=="」です。ただし、46(00101110)ではなく184(10111000)としてデコードされます。Base64が正しく動作するには、完全な24ビットグループが必要です。入力に十分なビットがない場合は、右側にゼロが埋め込まれます。最初の6ビットグループは「u」で、2番目はすべてゼロですが、元のデータから2ビットが残っているため、「=」パディングではなく「A」です。

RFC2405の6.8章「Base64Content-Transfer-Encoding」をお読みください

于 2012-08-24T08:47:03.820 に答える
1

Qtはbase64デコードの入力の有効性をチェックしないため、文字列がbase64形式に似ているかどうかをテストする例を次に示します。

bool isB64(QString input){
    if(input.length() % 4 != 0)
        return false;
    if(QRegExp("^[A-Za-z0-9+/]+$").indexIn(input, QRegExp::CaretAtZero) == -1 &&
            QRegExp("^[A-Za-z0-9+/]+=$").indexIn(input, QRegExp::CaretAtZero) == -1 &&
            QRegExp("^[A-Za-z0-9+/]+==$").indexIn(input, QRegExp::CaretAtZero) == -1)
        return false;
    return true;
}
于 2018-01-05T01:57:18.467 に答える