2012-09-14 46 views
3

使用python使用Base64編碼和解碼的問題,其中一個!= B

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KB====' 
a = base64.b32decode(sample) 
b = base64.b32encode(a) 

這個例子那爲什麼

樣本!= B?

哪來

sample = '5PB37L2CH5DUDWN2SUOYE6LJPYCJBFM5N2FGVEHF7HD224UR52KBAAAA' 

然後

樣品== b

回答

4

你到了那裏是無效的base64第一個樣品。

從維基採取:

當字節編碼的數量不能被3整除(即,如果僅存在一個或兩個字節的最後塊輸入的),然後將下面的動作執行:添加值爲零的額外字節,以便有三個字節,並執行到base64的轉換。如果只有一個有效輸入字節,則只會選取前兩個base64數字,如果有兩個有效輸入字節,則會選取前三個base64數字。可能會添加'='字符以使最後一個塊包含四個base64字符。

http://en.wikipedia.org/wiki/Base64#Examples

編輯:

取自RFC 4648:如果少於24個比特可用
在數據的末尾被編碼進行

特殊加工。一個完整的編碼量程是
總是在一個數量的末尾完成。當在輸入組中有少於24個輸入時,位數爲零的位被添加
(在右側)以形成整數個6位組。使用'='字符執行數據末尾的填充

4次8位(=在的)(在您的sample的端部)比24位更使它們在至少不必要。 (不知道什麼數據類型sample是,卻發現,並採取它的大小倍的字符數除以24)

你特別sample:基本編碼

在24位塊讀取,只需要「=」填充在將基本字符串分割成24位的字符串之後剩餘字符的字符應該是「大小爲24」的字符,以便解碼器能夠解析該字符。 因爲====的在你的字符串量的結束比24位更它們是無用的,因此:無效...

+0

嗨,我不明白爲什麼第一個樣本無效?你能把它分解下來嗎? a = base64.b32解碼(示例)對其工作得很好。 – Ernest

+0

嗨,謝謝你的回答,你可以請擴展一下嗎?該示例是一個Base32字符串,我試圖傳遞給apns-python-wrapper。也許編碼和解碼結束位是一個旋轉位,我嘗試使用編碼和解碼進行驗證可能在這裏無效? – Ernest

+0

看到我上面的編輯 –

1

首先,讓我們明確一點:你的問題是關於base32,不是BASE64。

您的原始樣本有點太長。最後有4個=填充,意味着至少填充20位。位數必須是8的倍數,所以它確實是24位。 B在base32中的編碼是1,這意味着填充位中的一個被設置。這違反了規範,說所有的填充位必須清楚。解碼完全丟棄該位,並且編碼產生適當的值A而不是B

+0

嗨,謝謝你的回答。你可以請擴展更多?該示例是一個Base32字符串,我試圖傳遞給apns-python-wrapper。也許編碼和解碼結束位是一個旋轉位,我嘗試使用編碼和解碼進行驗證可能在這裏無效? – Ernest

+0

@TurbZ,輸入無效。最後編碼的位是1,因爲它是填充的一部分,所以它必須是0。對它進行解碼和編碼可以修復它,所以它不再與原來的相匹配。 –

+0

好吧。謝謝馬克。 – Ernest