關於base64編碼的原理及實現

2021-09-20 14:52:12 字數 2873 閱讀 5234

但是處於好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支援原生base64編碼的ie下可以得以實現。

【base64】

-base64的編碼都是按字串長度,以每3個8bit的字元為一組,

-然後針對每組,首先獲取每個字元的ascii編碼,

-然後將ascii編碼轉換成8bit的二進位制,得到一組3*8=24bit的位元組

-然後再將這24bit劃分為4個6bit的位元組,並在每個6bit的位元組前面都填兩個高位0,得到4個8bit的位元組

-然後將這4個8bit的位元組轉換成10進製,對照base64編碼表 (下表),得到對應編碼後的字元。

(注:1. 要求被編碼字元是8bit的,所以須在ascii編碼範圍內,\u0000-\u00ff,中文就不行。

2. 如果被編碼字元長度不是3的倍數的時候,則都用0代替,對應的輸出字元為=)

base64 編碼表

value

char

value

char

value

char

value

char0a

16q32g

48w1b

17r33h

49x2c

18s34i

50y3d

19t35j

51z4e

20u36k

5205f

21v37l

5316g

22w38m

5427h

23x39n

5538i

24y40o

5649j

25z41p

57510k

26a42q

58611l

27b43r

59712m

28c44s

60813n

29d45t

61914o

30e46u

62+15p

31f47v

63/比如舉下面2個例子:

a) 字元長度為能被3整除時:比如「tom」 :

t           o           m

ascii: 84 111 109

8bit位元組: 01010100 01101111 01101101

6bit位元組: 010101 000110 111101 101101

十進位制: 21 6 61 45

對應編碼: v g 9 t

所以,btoa('tom') = vg9t

b) 字串長度不能被3整除時,比如「lucy」:

l           u           c           y

ascii: 76 117 99 121

8bit位元組: 01001100 01110101 01100011 01111001 00000000 00000000

6bit位元組: 010011 000111 010101 100011 011110 010000 000000 000000

十進位制: 19 7 21 35 30 16 (異常) (異常)

對應編碼: t h v j e q = =

由於lucy只有4個字母,所以按3個一組的話,第二組還有兩個空位,所以需要用0來補齊。這裡就需要注意,因為是需要補齊而出現的0,所以轉化成十進位制的時候就不能按常規用base64編碼表來對應,所以不是a, 可以理解成為一種特殊的「異常」,編碼應該對應「=」。

有了上面的理論,那我們實現乙個base64編碼就容易了。

/**

* base64 encoding & decoding

* for fixing browsers which don't support base64 | btoa |atob

*/(function (win, undefined)

var i = 0,

prev,

ascii,

mod,

result = ;

while (i < s.length)

prev = ascii;

i ++;

}// 迴圈結束後看mod, 為0 證明需補3個6位,第乙個為最後乙個8位的最後兩位後面補4個0。另外兩個6位對應的是異常的「=」;

// mod為1,證明還需補兩個6位,乙個是最後乙個8位的後4位補兩個0,另乙個對應異常的「=」

if(mod == 0) else if (mod == 1)

return result.join('');

}// atob method

// 逆轉encode的思路即可

function _atob (s)

prev = cur;

i ++;

}return result.join('');

}return ;

}();

if (!win.base64)

if (!win.btoa)

if (!win.atob)

})(window)

base64 example

關於base64編碼的原理及實現

但是處於好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支援原生base64編碼的ie下可以得以實現。base64 base64的編碼都是按字串長度,以每3個8bit的字元為一組,然後針對每組,首先獲取每個字元的ascii編碼,然後將ascii編碼轉換成8bit的二進位制,得到一組3 8...

關於base64編碼的原理及實現

但是處於好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支援原生base64編碼的ie下可以得以實現。base64 base64的編碼都是按字串長度,以每3個8bit的字元為一組,然後針對每組,首先獲取每個字元的ascii編碼,然後將ascii編碼轉換成8bit的二進位制,得到一組3 8...

關於base64編碼的原理及實現

但是處於好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支援原生base64編碼的ie下可以得以實現。base64 base64的編碼都是按字串長度,以每3個8bit的字元為一組,然後針對每組,首先獲取每個字元的ascii編碼,然後將ascii編碼轉換成8bit的二進位制,得到一組3 8...