Base64编码说明
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
Base64编码表
| 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 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 | / |
T o m
ASCII: 84 111 109
8bit字节: 01010100 01101111 01101101
6bit字节: 010101 000110 111101 101101
十进制: 21 6 61 45
对应编码: V G 9 t
ASCII: 84 111 109
8bit字节: 01010100 01101111 01101101
6bit字节: 010101 000110 111101 101101
十进制: 21 6 61 45
对应编码: V G 9 t
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 = =
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 = =
代码实现:
int base64_encode( char *gb2312string, char *base64string, int gb2312stringlen )
{static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int base64_len = 0;
// 10101001 11001000 11011101 待编码的三个字节
// | | | |
// 00101010 00011100 00100011 00011101 编码后的四个字节
while( gb2312stringlen > 0 ){
*base64string ++ = Base64Encode[(gb2312string[0] >> 2 ) & 0x3f];
if( gb2312stringlen > 2 ){
*base64string ++ = Base64Encode[((gb2312string[0] & 3) << 4) | (gb2312string[1] >> 4)];
*base64string ++ = Base64Encode[((gb2312string[1] & 0xF) << 2) | (gb2312string[2] >> 6)];
*base64string ++ = Base64Encode[((gb2312string[0] & 3) << 4) | (gb2312string[1] >> 4)];
*base64string ++ = Base64Encode[((gb2312string[1] & 0xF) << 2) | (gb2312string[2] >> 6)];
*base64string ++ = Base64Encode[gb2312string[2] & 0x3F];
}
else
{
switch( gb2312stringlen )
{
case 1:
}
else
{
switch( gb2312stringlen )
{
case 1:
*base64string ++ = Base64Encode[(gb2312string[0] & 3) << 4 ];*base64string ++ = '=';*base64string ++ = '=';
break;
case 2:
case 2:
*base64string ++ = Base64Encode[((gb2312string[0] & 3) << 4) | (gb2312string[1] >> 4)];*base64string ++ = Base64Encode[((gb2312string[1] & 0x0F) << 2)];*base64string ++ = '=';break;
}
}
gb2312string +=3;
gb2312stringlen -=3;
base64_len +=4;
}
*base64string = 0;
return base64_len;
}