试着写 Base64 编码算法 [原]

BOOL EncodeBase64( LPBYTE lpDes,  DWORD dwDesLen,  const LPBYTE lpSrc,  DWORD dwSrcLen)
{
      if( (dwDesLen/4) < (dwSrcLen/3))
           return  FALSE;

      DWORD len = dwSrcLen/3;      //循环次数
      LPBYTE lpBufSrc =  NULL;
      LPBYTE lpBufDes =  NULL;
      //不论是否是3的倍数,都加1
     lpBufSrc =  new BYTE [ 3*(len+1)+1 ] ;
     lpBufDes =  new BYTE [ 4*(len+1)+1 ] ;
      memset( lpBufSrc, 0, 3*(len+1)+1);
      memset( lpBufDes, 0, 4*(len+1)+1);
      memcpy(lpBufSrc, lpSrc, dwSrcLen);
      LPBYTE lpTmpSrc = lpBufSrc;
      LPBYTE lpTmpDes = lpBufDes;
      int nAddress = 0;
      //先转换3的倍数里的数据
      for( DWORD i=0; i<len; i++)
     {
          nAddress = *lpTmpSrc >> 2;
          *lpTmpDes = base64_alphabet[nAddress];
          nAddress = (*lpTmpSrc & 0x3) ;
          nAddress = nAddress << 4;
          nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
          *(lpTmpDes+1) = base64_alphabet[nAddress];
          nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
          nAddress += *(lpTmpSrc+2) >> 6;
          *(lpTmpDes+2) = base64_alphabet[nAddress];
          nAddress = *(lpTmpSrc+2)&0x3f;
          *(lpTmpDes+3) = base64_alphabet[nAddress];
          lpTmpDes += 4;
          lpTmpSrc += 3;
     }

      //若不是 3 的倍数,再考虑余下的 2 位
      if( 0!=dwSrcLen%3)
     {
          nAddress = *lpTmpSrc >> 2;
          *lpTmpDes = base64_alphabet[nAddress];
          nAddress = (*lpTmpSrc & 0x3) ;
          nAddress = nAddress << 4;
          nAddress += (*(lpTmpSrc+1)&0xf0) >> 4;
          *(lpTmpDes+1) = base64_alphabet[nAddress];

           switch( dwSrcLen%3)
          {          
                case 2:
                    nAddress = ( *(lpTmpSrc+1)&0xf) << 2;
                    nAddress += *(lpTmpSrc+2) >> 6;
                    *(lpTmpDes+2) = base64_alphabet[nAddress];
                     break;
                case 1:
                    *(lpTmpDes+2) = '=';
                     break;
          }
          *(lpTmpDes+3) = '=';
     }

      memcpy(lpDes, lpBufDes, dwDesLen) ;
      delete [] lpBufSrc;
      delete [] lpBufDes;
      return  TRUE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值