2012-08-23 103 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; 
}