2013-09-27 43 views
0

下面是我從Philippe Tenenhaus(http://www.philten.com/us-xmlhttprequest-image/)得到的基本64圖像編碼功能。javascript中的base 64編碼

這讓我很困惑,但我很想理解。

我想我明白了按位&和| ,並通過< <和>>在字節位置移動。

我特別困惑那些線: ((byte1 & 3)< < 4)| (byte2 >> 4); ((byte 2 & 15)< < 2)| (byte3 >> 6);

爲什麼它仍然使用byte1作爲enc2,而byte2作爲enc3。 而enc4 = byte3 & 63;的目的...

有人可以解釋這個功能。

function base64Encode(inputStr) 
      { 
       var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
       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

這可能有助於瞭解Base64編碼的功能。它將8位分組中的24位轉換爲6位分組。 (http://en.wikipedia.org/wiki/Base64

因此enc1是第一個6位字節的前6位,即第一個字節的前6位。

enc2是下一個6位,第一個字節的最後2位和第二個字節的前4位。按位和操作字節3以第一個字節中的最後2位爲目標。 所以,

XXXXXXXX & 00000011 = 000000XX

然後將它向左移4位。

000000XX < < 4 = 00XX0000。

的字節2 >> 4執行右位移位,分離的第二個字節的前4位,以下

YYYYXXXX所示>> 4 = 0000YYYY

所以,((字節1 & 3)< < 4)| (字節2 >> 4)將結果與按位或

00XX0000 | 0000YYYY = 00XXYYYY

enc3是第二個字節的最後4位和第三個字節的前2位。

enc4是第3個字節的最後6位。

charCodeAt返回一個16位值的Unicode代碼點,所以它似乎假定相關信息只在低8位中。這個假設讓我懷疑代碼中是否還存在一個錯誤。由於這種假設可能會丟失一些信息。

+0

維基百科鏈接中的第一個例子是一個很好的例子。 – Tyler

+0

太棒了!我幾乎瞭解所有。爲什麼'(byte1&3)<< 4'和'(byte2&15)<< 2'?我不明白爲什麼4和2. – trogne

+0

行我知道!(byte1&3)成爲第一個2位,然後更強大,所以x2x2x2x2。但是:下面添加了'all three'&0xff'來解決一個已知的錯誤':錯誤是什麼?請告訴我,如果我是正確的:該函數只讀取yeach字節的最後八位字節(0xFF = 00000000000000000000000011111111)。當閱讀更多時,有一個錯誤。 – trogne