用C语言实现的Base64编码&解码

Base64算法将输入的字符串或一段数据编码成只含有{''A''-''Z'', ''a''-''z'', ''0''-''9'', ''+'', ''/''}这64个字符的串,
''=''用于填充。其编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。
这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以''=''填充。

编码的过程是这样的:

第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符左移4位加上第二个字符右移4位,即获得第二个目标字符。
再将第二个字符左移2位加上第三个字符右移6位,获得第三个目标字符。
最后取第三个字符的右6位即获得第四个目标字符。

在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

80,114,105

01010000,01110010,01101001
Bit(1){20} = 00010100 {(01010000 & 11111100) >> 2}    '高6位(高)组成6位字节.
Bit(2){07} = 00000111 {(01010000 & 00000011) << 4 + (01110010 & 11110000) >> 4} '第一字节低2位(高)与第二字节高4位(低)组成6位字节。
Bit(3){09} = 00001001 {(01110010 & 00001111) << 2 + (01101001 & 11000000) >> 6} '第二字节低4位(高)与第三字节高2位(低)组成6位字节。
Bit(4){41} = 00101001 {01101001 & 00111111}     '第三字节低6位(低)组成6位;

  1. static wchar_t const keys[66]   = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  2. void Endcode( unsigned char *Input, int Length, wchar_t *Output ){
  3.     unsigned char byte1(0);
  4.     unsigned char byte2(0);
  5.     unsigned char byte3(0);
  6.     unsigned char byte4(0);
  7.     while ( Length > 0 ){
  8.         byte1       = 0x3F & ( ( *(Input) & 0xFC ) >> 2 );      //把第一字节的高6位存入byte1;
  9.         byte2       = 0x30 & ( ( *(Input++) & 0x03 ) << 4 );    //把第一字节的低2位存入byte2;
  10.         byte3       = 64;
  11.         byte4       = 64;
  12.         
  13.         if( Length > 1 ){
  14.             byte2   |= 0x0F & ( ( *(Input) & 0xF0 ) >> 4 );     //把第二字节的高4位累加到byte2;
  15.             byte3   =  0x3C & ( ( *(Input++) & 0x0F ) << 2 );   //把第二字节的低4位存入byte2;
  16.         }
  17.         if( Length > 2 ){
  18.             byte3   |= 0x03 & ( ( *(Input) & 0xC0 ) >> 6 );     //把第三字节的高2位累加到byte3;
  19.             byte4   =  0x3F & ( ( *(Input++) & 0x3F ) );        //把第三字节的低6位存入到byte4;
  20.         }
  21.         *Output++   =  keys[byte1];
  22.         *Output++   =  keys[byte2];
  23.         *Output++   =  keys[byte3];
  24.         *Output++   =  keys[byte4];
  25.         Length      -= 3;
  26.     }
  27.     *Output         =  L'/0';
  28. }
  29. void Decode( wchar_t *Input, unsigned char *Output ){
  30.     unsigned char byte1(0);
  31.     unsigned char byte2(0);
  32.     unsigned char byte3(0);
  33.     unsigned char byte4(0);
  34.     size_t Length       = _tcslen( Input );
  35.     //如果Base64字符串长度必需为4的整数倍。
  36.     if( Length % 4 ) return ; 
  37.     while( Length > 0 ){
  38.         byte1       = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte1 < 0 || byte1 > 64 ) return;
  39.         byte2       = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte2 < 0 || byte2 > 64 ) return;
  40.         byte3       = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte3 < 0 || byte3 > 64 ) return;
  41.         byte4       = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte4 < 0 || byte4 > 64 ) return;
  42.         *Output++   =  ( ( byte1 << 2 ) & 0xFC ) | ( ( byte2 >> 4 ) & 0x03 ); if( byte3 == 64 ) break;
  43.         *Output++   =  ( ( byte2 << 4 ) & 0xF0 ) | ( ( byte3 >> 2 ) & 0x0F ); if( byte4 == 64 ) break;
  44.         *Output++   =  ( ( byte3 << 6 ) & 0xC0 ) | ( ( byte4 ) & 0x3F );
  45.         Length      -= 4;
  46.     }
  47. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值