2012-08-23 277 views
0

我想解码一个base64编码的字符串,它包含一些二进制数据。该字符串有时只包含一个字符。不幸的是,函数QByteArray :: fromBase64()只适用于较大的输入字符串。Qt - 从base64解码二进制序列

此代码的工作对我来说更大的输入字符串:那val包含13257788

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); 

后,这是在“ykw8”编码正确的数据。但是,如果我提交“u”作为fromBase64()的参数,则结果数组(text)的大小为0.变量val因此也包含0,尽管它应该是46.

我试过填充输入字符串,i。即“u ==”和类似的,但text的大小总是0. 那么我怎么从Base64()正确解码短字符串?

+0

你确定'“你好”是一个正确的base64编码字符串吗?因为'QByteArray :: fromBase64()'跳过了它无法解码的东西。 – UmNyobe

+3

如果使用'QByteArray :: toBase64()'将46转换为base64,则会得到“Lg ==”。所以很可能“U”不是一个有效的base64编码字符串(根据RFC 2045,Qt的实现基于此字符串),正如UmNyobe已经评论过的那样。 – 2012-08-23 15:25:05

回答

1

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

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

+0

我意识到这一点。我虽然base64只是数字转换为基地64就像十六进制是在16基地。我不得不写我自己的功能。 –

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