为什么这个代码有超过4个字符的3个八位字节

Why does this code have 3 octets over 4 characters?

本文关键字:字符 3个 八位 字节 4个 代码 为什么      更新时间:2023-09-26

我试图理解这个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个八位字节吗?

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

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