0

我正在尝试解码一个 base64 编码的字符串,其中包含一些二进制数据。字符串有时只包含一个字符。不幸的是,函数 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包含 13257788,这是“ykw8”中编码的正确数据。但是,如果我提交“u”作为 fromBase64() 的参数,则结果数组 ( text) 的大小为 0。因此该变量val也包含 0,尽管它应该是 46。

我已经尝试填充输入字符串,即“u==”和类似的,但大小text始终为0。那么如何正确地从Base64()解码短字符串?

4

2 回答 2

1

如果您坚持将“u”作为 base64 编码结果,则最接近的有效 base64 是“uA==”。但它不会解码为 46 (00101110) 而是 184 (10111000) 。Base64 需要完整的 24 位组才能正确运行。如果输入中没有足够的位,则在右侧补零。第一个 6 位组是“u”,第二个是全零,但它仍然有来自原始数据的 2 位,所以它不是“=”填充而是“A”。

阅读RFC 2405,第 6.8 章“Base64 内容传输编码”

于 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 回答