Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125785
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: C/C++

2015-04-03 09:33:26

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

                 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           =          =

代码实现:
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[2] & 0x3F];
                 }
                 else
                 {
                         switch( gb2312stringlen )
                         {
                                 case 1:
                                *base64string ++ = Base64Encode[(gb2312string[0] & 3) << 4 ];
                                 *base64string ++ = '=';
                                 *base64string ++ = '=';
                                            break;
                                 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;
 }
阅读(1270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~