【转】VC Base64编解码

来源:互联网 发布:矢量网络分析仪端口 编辑:程序博客网 时间:2024/05/16 18:42

#include <afx.h>
#include <stdio.h>

unsigned char * base64=(unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

// 编码
CString Base64Encode(CString src, int srclen)
{
 int n, buflen, i, j;
 CString buf = src;
 static unsigned char *dst;

 buflen = n = srclen;
 dst = (unsigned char*) malloc( buflen / 3 * 4 + 3 );
 memset(  dst, 0 ,  buflen / 3 *4+3);

 for( i = 0,j = 0; i <= buflen-3 ; i+=3, j+=4)
 {
  dst[j]   =  (buf[i] & 0xFC) >> 2;
  dst[j+1] =  ((buf[i] & 0x03) << 4) + (( buf[i+1] & 0xF0) >> 4);
  dst[j+2] =  ((buf[i+1] & 0x0F) << 2) + ((buf[i+2] & 0xC0) >> 6);
  dst[j+3] =  buf[i+2] & 0x3F;
    }
 if(n%3==1)
 {
  dst[j]   = (buf[i] & 0xFC) >> 2;
  dst[j+1] = ((buf[i] & 0x03) << 4);
  dst[j+2] = 64;
  dst[j+3] = 64;
  j+=4;
    }
 else if( n % 3 == 2)
 {
  dst[j]   = (buf[i] & 0xFC) >> 2;
  dst[j+1] = ((buf[i] & 0x03) << 4)+(( buf[i+1] & 0xF0) >> 4);
  dst[j+2] = ((buf[i+1] & 0x0F) << 2);
  dst[j+3] = 64;
  j+=4;
 }
 for(i=0;i<j;i++)
 {
  dst[i] = base64[ (int)dst[i] ];
 }
 dst[j] = 0;
 return  CString(dst);
}

// 解码
CString Base64Decode(CString inpt, int *len)
{
 int n, i, j, pad;
 unsigned char  *p;
 static unsigned char  *dst;
 unsigned char * src;

 *len = 0;
 pad = 0;
 n = inpt.GetLength();
 src = new unsigned char [n];
 for( i = 0; i < n; i++)
 {
  src[i] = inpt[i];
 }
 while( n > 0 && src[n-1] == '=')
 {
  src[n-1] = 0;
  pad++;
  n--;
 }
 for(i=0;i<n;i++)
 {
  p = (unsigned char *)strchr( (const char *)base64, (int)src[i]);
  if(!p)
   break;
  
  src[i] = p-(unsigned char *)base64;
 }

 dst = (unsigned char *)malloc( n*3/4+1);
 memset( dst, 0, n*3/4 +1);
 for( i = 0,j = 0; i < n; i += 4,j += 3)
 {
  dst[j] = (src[i] << 2) + ((src[i+1] & 0x30) >> 4);
  dst[j+1]=((src[i+1] & 0x0F) << 4) + ((src[i+2] & 0x3C) >> 2);
  dst[j+2]=((src[i+2] & 0x03) << 6) + src[i+3];
  *len += 3;
 }
 *len -= pad;
 return CString(dst);
}


源码下载:http://yunpan.cn/Qt4AJxziqKMTV
原创粉丝点击