Qt - 解码base64的二进制序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt - 解码base64的二进制序列相关的知识,希望对你有一定的参考价值。

我正在尝试解码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()正确解码短字符串?

答案

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

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

另一答案

因为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;
}

以上是关于Qt - 解码base64的二进制序列的主要内容,如果未能解决你的问题,请参考以下文章

base64

base64加密和解码原理和代码

ActionScript2 Base64 编码/解码二进制数据

奇怪的 Base64 编码/解码问题

GWT 中的快速 base64 解码

Java基础加密之BASE64加解密