Base64算法的资料整理(VC代码与ASM代码)

什么是Base64?

引用
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)



具体的见压缩包吧!
VC的实现是我修改过的,调用方法见头文件:Base64.h


/*************************************************************

 * $Id: base64.c,v 1.2 2004/02/04 02:17:32 hno Exp $
 *  2009/03/22 iawen修正了对中文支持的一些BUG


使用示例[VC]:
1、获取需要加密的字符串:
  char srcString[BASE64_RESULT_SZ];
  memset(srcString,0,BASE64_RESULT_SZN);
  GetDlgItemText(hDlg,IDC_SRC,srcString,BASE64_RESULT_SZ-1);

2、调用相应函数,并接收返回的值:
  char destString[BASE64_RESULT_SZ];
  memset(destString,0,BASE64_RESULT_SZ);
  Base64Init();
  Base64Encode(srcString,destString);
  SetDlgItemText(hDlg,IDC_DEST,destString);

**************************************************************/

#define __IAWEN_BASE64_H__

#ifdef __IAWEN_BASE64_H__

   #define BASE64_VALUE_SZ 256
   #define BASE64_RESULT_SZ 8192

   extern  char base64_code [ ] ;
   void Base64Init ( ) ;   //初始化设置
   void Base64Decode ( const  char  *srcString , char  *destString ) ;
       //对字符串进行解密
       //  srcString:    指向需要加密的字符串
       //  destString:  保存加密后的字符串,用以返回
                    
   void Base64Encode ( const  char  *srcString , char  *destString ) ;
       //对字符串进行加密
       //  srcString:    指向加密后的字符串
       //  destString:  保存解密后的字符串,用以返回

#endif
 



Base64.cpp的具体代码也如下:


/*
 * $Id: base64.c,v 1.2 2004/02/04 02:17:32 hno Exp $
 *  2009/03/22 iawen修正了对中文支持的一些BUG
 */


#include <stdlib.h>
#include"Base64.h"

int base64_value [BASE64_VALUE_SZ ] ;
char base64_code [ ]  =  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;

void Base64Init ( ) {
     int i ;

     for  (i  =  0 ; i  < BASE64_VALUE_SZ ; i ++ )
    base64_value [i ]  =  - 1 ;

     for  (i  =  0 ; i  <  64 ; i ++ )
    base64_value [ ( int ) base64_code [i ] ]  = i ;
    base64_value [ '=' ]  =  0 ;
}

void Base64Decode ( const  char  *srcString , char  *destString ) {
     int j ;
     int c ;
     long val ;
     if  ( !srcString )
     return ;

    val  = c  =  0 ;
     for  (j  =  0 ;  *srcString  && j  +  4  < BASE64_RESULT_SZ ; srcString ++ )  {
     unsigned  char ch = ( ( unsigned  char )  *srcString ) ;
     if (ch == '/' )     //修正部分一:当加密字符为'/'时,替换值为0
      ch = 0 ;
     unsigned  int k  = ch  % BASE64_VALUE_SZ ;
     if  (base64_value [k ]  <  0 )
       continue ;
    val  <<=  6 ;
    val  += base64_value [k ] ;
     if  ( ++c  <  4 )
       continue ;
     /* One quantum of four encoding characters/24 bit */
    destString [j ++ ]  =  (val  >>  16 )  &  0xff ;   /* High 8 bits */
    destString [j ++ ]  =  (val  >>  8 )  &  0xff ;   /* Mid 8 bits */
    destString [j ++ ]  = val  &  0xff ;   /* Low 8 bits */
    val  = c  =  0 ;
     }
    destString [j ]  =  0 ;
     return ;
}

/* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
void Base64Encode ( const  char  *srcString , char  *destString ) {
     int bits  =  0 ;
     int char_count  =  0 ;
     int out_cnt  =  0 ;
     int c ;

     if  ( !srcString )
     return ;

     while  ( (c  =  ( unsigned  char )  *srcString ++ )  && out_cnt  <  sizeof (destString )  -  5 )  {
    bits  += c ;
    char_count ++;
     if  (char_count  ==  3 )  { //修正部分二:当操作结果为0时,用'/'替换
       char tmp =base64_code [bits  >>  18 ] ;
       if (tmp == 0 )
        destString [out_cnt ++ ]  = '/'  ;
       else
        destString [out_cnt ++ ]  =tmp ;

      tmp =base64_code [ (bits  >>  12 )  &  0x3f ] ;
       if (tmp == 0 )
        destString [out_cnt ++ ]  = '/'  ;
       else
        destString [out_cnt ++ ]  =tmp ;

      tmp =base64_code [ (bits  >>  6 )  &  0x3f ] ;
       if (tmp == 0 )
        destString [out_cnt ++ ]  = '/'  ;
       else
        destString [out_cnt ++ ]  =tmp ;
      
      tmp =base64_code [bits  &  0x3f ] ;
       if (tmp == 0 )
        destString [out_cnt ++ ]  = '/'  ;
       else
        destString [out_cnt ++ ]  =tmp ;

      bits  =  0 ;
      char_count  =  0 ;
     }  else  {
      bits  <<=  8 ;
     }
     }
     if  (char_count  !=  0 )  {
    bits  <<=  16  -  ( 8  * char_count ) ;
    destString [out_cnt ++ ]  = base64_code [bits  >>  18 ] ;
    destString [out_cnt ++ ]  = base64_code [ (bits  >>  12 )  &  0x3f ] ;
     if  (char_count  ==  1 )  {
      destString [out_cnt ++ ]  =  '=' ;
      destString [out_cnt ++ ]  =  '=' ;
     }  else  {
      destString [out_cnt ++ ]  = base64_code [ (bits  >>  6 )  &  0x3f ] ;
      destString [out_cnt ++ ]  =  '=' ;
     }
     }
    destString [out_cnt ]  =  '/0' ;   /* terminate */
     return ;
}
 


在使用时,只需要包含:base64.h这个头文件,就可以如示例般调用了!
ASM的实现是网上收集的,大家自己看吧,没有具体测试过。

这里将这些放在一起,是方便自己的查找与整理!

下载文件 (已下载 149 次)
转帖地址:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值