首先来说下base64的编码原理,base64编码是把3个8bit(3*8=24bit)编码成4个6bit(4*6=24bit),并在每个6bit高位添加两个0构成一个8bit,然后换算成10进制,反查编码表即可得到对应的编码。由于2^6=64,即6bit的最大值是63,所以只需要64(0~63)个ASCII字符即可表示所有编码,因此得名base64编码。
base64的编码表如下:
| Base64 编码表(十进制) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Value | Char | Value | Char | Value | Char | Value | Char | |||
| 0 | A | 16 | Q | 32 | g | 48 | w | |||
| 1 | B | 17 | R | 33 | h | 49 | x | |||
| 2 | C | 18 | S | 34 | i | 50 | y | |||
| 3 | D | 19 | T | 35 | j | 51 | z | |||
| 4 | E | 20 | U | 36 | k | 52 | 0 | |||
| 5 | F | 21 | V | 37 | l | 53 | 1 | |||
| 6 | G | 22 | W | 38 | m | 54 | 2 | |||
| 7 | H | 23 | X | 39 | n | 55 | 3 | |||
| 8 | I | 24 | Y | 40 | o | 56 | 4 | |||
| 9 | J | 25 | Z | 41 | p | 57 | 5 | |||
| 10 | K | 26 | a | 42 | q | 58 | 6 | |||
| 11 | L | 27 | b | 43 | r | 59 | 7 | |||
| 12 | M | 28 | c | 44 | s | 60 | 8 | |||
| 13 | N | 29 | d | 45 | t | 61 | 9 | |||
| 14 | O | 30 | e | 46 | u | 62 | + | |||
| 15 | P | 31 | f | 47 | v | 63 | / | |||
下面来举例说明:
有一个字符串”abcd”
a b c d ASCII: 0x61 0x62 0x63 0x64 8bit: 01100001 01100010 01100011 0110 0100 6bit: 011000 010110 001001 100011 011001 000000 = = 十进制: 24 22 9 35 25 0 查码表得: Y W J j Z A = = 最终结果:YWJjZA==
你可能注意到了,是每3个8bit进行一次编码,如果编码到最后不够3字节怎么办?base64编码规定,对于不够3个8bit的,编码完成后少几个6bit添几个”=”,这会有两种情况:
1.剩1个8bit(假设为xxxxxxxx): 编码完成后得到: xxxxxx xx0000 = = 此时还缺2个6bit,因此在末尾添加“==”
2.剩2个8bit(假设为xxxxxxxx yyyyyyyy): 编码后得到: xxxxxx xxyyyy yy0000 = 此时还缺1个6bit,因此在末尾添加“=”
这也是为什么base64编码完成后面会有1到2个”=”。
//base64编码表
var base64_encode_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function encode(s){
var i = 0;
var out = [];
while(i>2));
out.push(base64_encode_chars.charAt(c1<<4 & 0x30));
out.push("==");
break;
}
var c2 = s.charCodeAt(i++);
if(i == s.length){
out.push(base64_encode_chars.charAt(c1>>2));
out.push(base64_encode_chars.charAt(c1<<4 & 0x30 | c2>>4));
out.push(base64_encode_chars.charAt(c2<<2 & 0x3C));
out.push("=");
}
var c3 = s.charCodeAt(i++);
out.push(base64_encode_chars.charAt(c1>>2));
out.push(base64_encode_chars.charAt(c1<<4 & 0x30 | c2>>4));
out.push(base64_encode_chars.charAt(c2<<2 & 0x3C | c3>>6));
out.push(base64_encode_chars.charAt(c3 & 0x3F));
}
return out.join('');
}
