Qt - 解码base64的二进制序列

问题描述 投票:0回答:2

我正在尝试解码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.那么我如何从fromBase64()正确解码短字符串?

c++ qt base64
2个回答
1
投票

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

阅读RFC 2405,第6.8章“Base64 Content-Transfer-Encoding”


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.