在JavaScript中编码base 64

时间:2013-09-27 16:39:19

标签: javascript encoding base64

以下是我从Philippe Tenenhaus(http://www.philten.com/us-xmlhttprequest-image/)获得的base 64图像编码功能。

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

我想我理解了bitwise&和| ,并使用<<<<<<<和>>。

我对这些方面感到特别困惑:     ((byte1& 3)<< 4)| (byte2>> 4);     ((byte2& 15)<< 2)| (byte3>> 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;
            }

1 个答案:

答案 0 :(得分:1)

了解Base64编码的功能可能会有所帮助。它将8位分组中的24位转换为6位分组。 (http://en.wikipedia.org/wiki/Base64

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

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

XXXXXXXX&amp; 00000011 = 000000XX

然后转移到左边的4位。

000000XX&lt;&lt; 4 = 00XX0000。

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

YYYYXXXX&gt;&gt; 4 = 0000YYYY

所以,((byte1&amp; 3)&lt;&lt; 4)| (byte2&gt;&gt; 4)将结果与按位或

组合

00XX0000 | 0000YYYY = 00XXYYYY

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

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

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