2017-02-05 112 views
2

This post建議(參見Anirudh Ramanathan的回答)Base64編碼的字符串最多可以包含3個相等的字符。在網絡的其他地方,我看到它可以是一個或兩個等號。從理論上講,由於我們必須將長度定爲4的倍數,Anirudh的答案似乎是正確的。哪些信息是錯誤的?Base64編碼的字符串可以以3個等號結尾嗎?

使用蠻力,我試圖尋找一個字符串的Base64將結束3等號,但沒有找到任何字符串長達10,000個字符的成功。

還是我錯過了這裏的明顯?

+1

這是不正確的。他基於這個猜測,要求字符串的長度必須是4的倍數,因此假定需要多達3個填充字符。他沒有意識到的是base64在填充之前總是會產生偶數個字符。所以最多需要2個填充字符。請注意FromBase64String [有錯誤](http://stackoverflow.com/a/21203467/17034)。 –

+0

我編輯它之前鏈接的答案在這裏http://stackoverflow.com/revisions/6309439/2 – Slai

回答

0

下表顯示三個輸入字節如何映射到四個Base64字符。

 1  2  3     
8-bit: 111111112222222233333333 
Base64: 111111222222333333444444 
     1  2  3  4     

此,模3的輸入,是最佳的編碼場景:沒有浪費位,並且不需要填充:輸出字符串是四個字符。

現在,當您只想編碼兩個輸入字節時,需要三個輸出字符。這意味着輸出將被填充一個填充字符,直到總共四個字符。

然後,最小的非空輸入(一個8位字節)被編碼爲兩個Base64字符。現在需要兩個填充字符來將輸出字符串填充爲四個字符。

沒有輸入是其中一個字符的輸出,因此您不必使用三個填充字符 - 只要您編碼的是整個8位字節。

2

不,它不能以3「=」號結尾。由於字節包含8位(2^8),並且64 = 2^6,所以base64編碼字符串的每4個字符恰好代表3個字節。因此base-64編碼的4個字符最多可以容納2^6 * 2^6 * 2^6 * 2^6位,這正好是2^8 * 2^8 * 2^8 = 3個字節。因爲2^8> 2^6,所以至少需要兩個基本的64個字符來編碼一個字節。由此可見,base-64字符串不能包含3個字符padding:1個字節將用兩個字符+兩個填充「=」字符編碼。顯然,2個字節不能超過兩個填充字符。 0和3個字節根本不需要填充。

+0

謝謝。挺好的。 – dotNET

相關問題