4

我试图理解这个 JavaScript base64 解码代码,但我对第 70-84 行的这个循环感到困惑:

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;
}

具体来说,我想知道为什么 4 个 ascii 字符中只有 3 个八位字节。不应该有4个八位字节吗?

4

2 回答 2

3

因为 3 个八位字节需要 24 位存储。在 base 64 中,每个字符(ascii 字符)有 6 位。4 个字符 * 6 位 = 24 位,因此 24 位需要 4 个 base64 字符。

于 2013-02-21T15:17:28.587 回答
2

注释指的是 Base64 算法本身。由于您将二进制字符串编码为 7 位 US-ASCII,因此字符串必须增长,这就是确切的比率:3 个源字节变成 4 个目标字符。

于 2013-02-21T15:17:07.373 回答