2013-02-21 69 views
4

我想了解this JavaScript base64 decoding code但我這個循環疑惑在lines 70-84爲什麼這個代碼有3個八位字節超過4個字符?

for (i=0; i<bytes; i+=3) { 
    //get the 3 octects in 4 ascii chars 
    enc1 = this._keyStr.indexOf(input.charAt(j++)); 
    enc2 = this._keyStr.indexOf(input.charAt(j++)); 
    enc3 = this._keyStr.indexOf(input.charAt(j++)); 
    enc4 = this._keyStr.indexOf(input.charAt(j++)); 

    chr1 = (enc1 << 2) | (enc2 >> 4); 
    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
    chr3 = ((enc3 & 3) << 6) | enc4; 

    uarray[i] = chr1;   
    if (enc3 != 64) uarray[i+1] = chr2; 
    if (enc4 != 64) uarray[i+2] = chr3; 
} 

具體來說,我想知道爲什麼只有3個在4個ASCII字符字節。不應該有4個八位字節?

回答

3

由於3個八比特組需要24比特的存儲。在64位中,每個字符有6位(ASCII字符)。 4個字符* 6位= 24位,因此24位需要4個base64字符。

+0

是不是ASCII 7位? – cdmckay 2013-07-27 19:00:44

+0

@cdmckay:這是因爲所有現代系統都使用8位字節,因此它非常不重要......最高位被浪費或用於指示額外信息。你可以將8個字符打包成7個字節,但是內存很便宜,相比之下,編碼/解碼會相當昂貴。 – Goz 2013-07-27 19:19:26

+0

沒錯,但你說你在答案中每個字符使用6位。我只是想知道第七位去了哪裏。 – cdmckay 2013-07-28 20:33:11

2

該註釋涉及Base64算法本身。由於您將二進制字符串編碼爲7位US-ASCII,因此字符串必須增大,這就是確切比例:3個源字節變爲4個目標字符。

相關問題