2013-02-21 42 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个目标字符。

相关问题