JavaScript 中的 Base 64 编码

base 64 encoding in javascript

本文关键字:编码 Base 中的 JavaScript      更新时间:2023-09-26

下面是我从Philippe Tenenhaus(http://www.philten.com/us-xmlhttprequest-image/(那里得到的base 64图像编码函数。

这对我来说很困惑,但我很想理解。

我想我理解按位 & 和 | ,以及使用 <<和>> 在字节位置移动。

我对这些行特别困惑: ((字节 1 和 3( <<4( |(字节 2>> 4(; ((字节2和15( <<2( |(字节 3>> 6(;

以及为什么它仍然使用 byte1 表示 enc2,使用 byte2 表示 enc3。而enc4 = byte3 & 63;的目的...

有人可以解释这个功能吗?

function base64Encode(inputStr) 
            {
               var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
               var outputStr = "";
               var i = 0;
               while (i < inputStr.length)
               {
                   //all three "& 0xff" added below are there to fix a known bug 
                   //with bytes returned by xhr.responseText
                   var byte1 = inputStr.charCodeAt(i++) & 0xff;
                   var byte2 = inputStr.charCodeAt(i++) & 0xff;
                   var byte3 = inputStr.charCodeAt(i++) & 0xff;
                   var enc1 = byte1 >> 2;
                   var enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);
                   var enc3, enc4;
                   if (isNaN(byte2))
                   {
                       enc3 = enc4 = 64;
                   }
                   else
                   {
                       enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);
                       if (isNaN(byte3))
                       {
                           enc4 = 64;
                       }
                       else
                       {
                           enc4 = byte3 & 63;
                       }
                   }
                   outputStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4);
                } 
                return outputStr;
            }

它可能有助于理解 Base64 编码的作用。它将 8 位分组中的 24 位转换为 6 位分组。(http://en.wikipedia.org/wiki/Base64(

所以 enc1,是第一个 6 位,它是第一个字节的前 6 位。

enc2 是下一个 6 位,第一个字节的最后 2 位和第二个字节的前 4 位。按位和操作 byte1 和 3 针对第一个字节中的最后 2 位。所以

XXXXXXXXX & 00000011 = 000000XX

然后向左移动 4 位。

000000XX <<4 = 00XX0000。

byte2>> 4 执行右位移位,隔离第二个字节的前 4 位,如下所示

YYYYXXXX>> 4 = 0000YYYY

所以,((字节1和3(<<4(|(字节 2>> 4( 将结果与按位或

00XX0000 | 0000YYYY = 00XXYYYY

enc3,是第二个字节的最后 4 位和第 3 个字节的前 2 位。

enc4 是第 3 个字节的最后 6 位。

charCodeAt 返回一个 Unicode 代码点,这是一个 16 位值,因此似乎假设相关信息仅在低 8 位中。这个假设让我想知道代码中是否仍然存在错误。由于这种假设,可能会丢失一些信息。