EnBase64 and DeBase64 code

EnBase64 and DeBase64 code

Base64 编码和解码,

说到Base64编码和解码,不过就是把3个字节进行处理后放置到4个字节空间。其原理就是:

    待编码数据,以3个字节为单位,依次取6位数据并在前面补上两个0形成新的8位编码,

由于3*8=4*6,这样3个字节的输入会变成4个字节的输出,长度上增加了1/3。

    以上处理存在着字符不是可见字符,故需制定了一个编码表来转换。码表大小为2^6=64,故称之Base64。

                            Base64编码表

      Value Encoding  Value Encoding  Value Encoding  Value Encoding
           0 A            17 R            34 i            51 z
           1 B            18 S            35 j            52 0
           2 C            19 T            36 k            53 1
           3 D            20 U            37 l            54 2
           4 E            21 V            38 m            55 3
           5 F            22 W            39 n            56 4
           6 G            23 X            40 o            57 5
           7 H            24 Y            41 p            58 6
           8 I            25 Z            42 q            59 7
           9 J            26 a            43 r            60 8
          10 K            27 b            44 s            61 9
          11 L            28 c            45 t            62 +
          12 M            29 d            46 u            63 /
          13 N            30 e            47 v
          14 O            31 f            48 w         (填充符pad) =
          15 P            32 g            49 x
          16 Q            33 h            50 y

摘录处理代码如下:

注意的是,一般在vc下编程汉字编码都是ansi,如果用到unicon or utf-8的话,注意其细节编码的处理。

可能考虑用以WideCharToMultiByte来处理。以下编码则是在ansi编码原则下的源码。

  1  const    char  EnBase64Tab[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ " ;
  2  const    char  DeBase64Tab[]  =
  3  {
  4       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ,
  5       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ,
  6       62 ,         //  '+'
  7       0 0 0 ,
  8       63 ,         //  '/'
  9       52 53 54 55 56 57 58 59 60 61 ,         //  '0'-'9'
 10       0 0 0 0 0 0 0 ,
 11       0 1 2 3 4 5 6 7 8 9 10 11 12 ,
 12       13 14 15 16 17 18 19 20 21 22 23 24 25 ,         //  'A'-'Z'
 13       0 0 0 0 0 0 ,
 14       26 27 28 29 30 31 32 33 34 35 36 37 38 ,
 15       39 40 41 42 43 44 45 46 47 48 49 50 51 ,         //  'a'-'z'
 16  };
 17 
 18  int    EncodeBase64( const  unsigned  char *  pSrc,  char *  pDst,  int  nSrcLen)
 19  {
 20      unsigned  char  c1, c2, c3;     //  输入缓冲区读出3个字节
 21       int  nDstLen  =   0 ;              //  输出的字符计数
 22       int  nLineLen  =   0 ;             //  输出的行长度计数
 23       int  nDiv  =  nSrcLen  /   3 ;       //  输入数据长度除以3得到的倍数
 24       int  nMod  =  nSrcLen  %   3 ;       //  输入数据长度除以3得到的余数
 25       //  每次取3个字节,编码成4个字符
 26       for  ( int  i  =   0 ; i  <  nDiv; i  ++ )
 27      {
 28           //  取3个字节
 29          c1  =   * pSrc ++ ;
 30          c2  =   * pSrc ++ ;
 31          c3  =   * pSrc ++ ;
 32           //  编码成4个字符
 33           * pDst ++   =  EnBase64Tab[c1  >>   2 ];
 34           * pDst ++   =  EnBase64Tab[((c1  <<   4 |  (c2  >>   4 ))  &   0x3f ];
 35           * pDst ++   =  EnBase64Tab[((c2  <<   2 |  (c3  >>   6 ))  &   0x3f ];
 36           * pDst ++   =  EnBase64Tab[c3  &   0x3f ];
 37          nLineLen  +=   4 ;
 38          nDstLen  +=   4 ;
 39      }
 40       //  编码余下的字节
 41       if  (nMod  ==   1 )
 42      {
 43          c1  =   * pSrc ++ ;
 44           * pDst ++   =  EnBase64Tab[(c1  &   0xfc >>   2 ];
 45           * pDst ++   =  EnBase64Tab[((c1  &   0x03 <<   4 )];
 46           * pDst ++   =   ' = ' ;
 47           * pDst ++   =   ' = ' ;
 48          nLineLen  +=   4 ;
 49          nDstLen  +=   4 ;
 50      }
 51       else   if  (nMod  ==   2 )
 52      {
 53          c1  =   * pSrc ++ ;
 54          c2  =   * pSrc ++ ;
 55           * pDst ++   =  EnBase64Tab[(c1  &   0xfc >>   2 ];
 56           * pDst ++   =  EnBase64Tab[((c1  &   0x03 <<   4 |  ((c2  &   0xf0 >>   4 )];
 57           * pDst ++   =  EnBase64Tab[((c2  &   0x0f <<   2 )];
 58           * pDst ++   =   ' = ' ;
 59          nDstLen  +=   4 ;
 60      }
 61       //  输出加个结束符
 62       * pDst  =   ' \0 ' ;
 63       return  nDstLen;
 64  }
 65 
 66  // Base64解码方法中,最简单的也是查表法:将64个可打印字符的值作为索引,查表得到的值(范围为0-63)依次连起来,
 67 
 68  // 拼凑成字节形式输出,就得到解码结果。
 69  int    DecodeBase64( const   char *  pSrc, unsigned  char *  pDst,  int  nSrcLen)
 70  {
 71       int  nDstLen;             //  输出的字符计数
 72       int  nValue;              //  解码用到的长整数
 73       int  i;
 74      i  =   0 ;
 75      nDstLen  =   0 ;
 76       //  取4个字符,解码到一个长整数,再经过移位得到3个字节
 77       while  (i  <  nSrcLen)
 78      {
 79           if  ( * pSrc  !=   ' \r '   &&   * pSrc != ' \n ' )
 80          {
 81              nValue  =  DeBase64Tab[ * pSrc ++ <<   18 ;
 82              nValue  +=  DeBase64Tab[ * pSrc ++ <<   12 ;
 83               * pDst ++   =  (nValue  &   0x00ff0000 >>   16 ;
 84              nDstLen ++ ;
 85               if  ( * pSrc  !=   ' = ' )
 86              {
 87                  nValue  +=  DeBase64Tab[ * pSrc ++ <<   6 ;
 88                   * pDst ++   =  (nValue  &   0x0000ff00 >>   8 ;
 89                  nDstLen ++ ;
 90                   if  ( * pSrc  !=   ' = ' )
 91                  {
 92                      nValue  +=  DeBase64Tab[ * pSrc ++ ];
 93                       * pDst ++   = nValue  &   0x000000ff ;
 94                      nDstLen ++ ;
 95                  }
 96              }
 97              i  +=   4 ;
 98          }
 99           else          //  回车换行,跳过
100          {
101              pSrc ++ ;
102              i ++ ;
103          }
104       }
105       //  输出加个结束符
106       * pDst  =   ' \0 ' ;
107       return  nDstLen;
108  }

你可能感兴趣的:(EnBase64 and DeBase64 code)