加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

跨平台C++ Base 64 编码解码函数

(2005-05-26 11:38:43)
标签:

杂谈

分类: 计算机与 Internet


void CConvert::_enBase6 4Help(unsigned char chasc[3],unsigned char chuue[4])
{
 int i, k=2;
 unsigned char t = 0;
 for(i=0; i<3; i++)
 {
  *(chuue+i) = *(chasc+i)>>k;
  *(chuue+i) |= t;
  t = *(chasc+i)<<(8-k);
  t >>= 2;
  k += 2;
 }
 *(chuue+3) = *(chasc+2)&63;
 
 for ( i=0; i<4; i++ ) {
  if ( (*(chuue+i)<=128) && (*(chuue+i)<=25) ) {
   *(chuue+i) += 65; // 'A'-'Z'
  } else if ( (*(chuue+i)>=26) && (*(chuue+i)<=51) ) {
   *(chuue+i) += 71; // 'a'-'z'
  } else if ( (*(chuue+i)>=52) && (*(chuue+i)<=61) ) {
   *(chuue+i) -= 4; // 0-9
  } else if ( *(chuue+i)==62 ) {
   *(chuue+i) = 43; // +
  } else if ( *(chuue+i)==63 ) {
   *(chuue+i) = 47; // /
  }
 }
}

void CConvert::_deBase6 4Help(unsigned char chuue[4],unsigned char chasc[3]) {
 int i,k=2;
 unsigned char t=0;

 for( i=0; i<4; i++) {
  if ( (*(chuue+i)>=65) && (*(chuue+i)<=90))
   *(chuue+i) -= 65; // 'A'-'Z' -> 0-25
  else if ( (*(chuue+i)>=97)&&(*(chuue+i)<=122) )
   *(chuue+i) -= 71; // 'a'-'z' -> 26-51
  else if ( (*(chuue+i)>=48)&&(*(chuue+i)<=57) )
   *(chuue+i) += 4; // '0'-'9' -> 52-61
  else if ( *(chuue+i)==43 )
   *(chuue+i) = 62; // + -> 62
  else if ( *(chuue+i)==47 )
   *(chuue+i) = 63; // / -> 63
  else if ( *(chuue+i)==61 )
   *(chuue+i) = 0;  // = -> 0  Note: 'A'和'='都对应了0
 }
 for ( i=0; i<3; i++ ) {
  *(chasc+i) = *(chuue+i) << k;
  k += 2;
  t = *(chuue+i+1) >> (8-k);
  *(chasc+i) |= t;
 }
}

string CConvert::enBase6 4( const char* inbuf, size_t inbufLen ) {
 string outStr;
 unsigned char in[8];
 unsigned char out[8];
 out[4] = 0;
 size_t blocks = inbufLen / 3;
 for ( size_t i=0; i<blocks; i++ ) {
  in[0] = inbuf[i*3];
  in[1] = inbuf[i*3+1];
  in[2] = inbuf[i*3+2];
  _enBase6 4Help(in,out);
  outStr += out[0];
  outStr += out[1];
  outStr += out[2];
  outStr += out[3];
 }
 if ( inbufLen % 3 == 1 ) {
  in[0] = inbuf[inbufLen-1];
  in[1] = 0;
  in[2] = 0;
  _enBase6 4Help(in,out);
  outStr += out[0];
  outStr += out[1];
  outStr += '=';
  outStr += '=';
 } else if ( inbufLen % 3 == 2 ) {
  in[0] = inbuf[inbufLen-2];
  in[1] = inbuf[inbufLen-1];
  in[2] = 0;
  _enBase6 4Help(in,out);
  outStr += out[0];
  outStr += out[1];
  outStr += out[2];
  outStr += '=';
 }
 return string(outStr);
}

string CConvert::enBase6 4( const string &inbuf)
{
 return CConvert::enBase6 4( inbuf.c_str(), inbuf.size() );
}

int CConvert::deBase6 4( string src, char* outbuf ) {

 // Break when the incoming base6 4 coding is wrong
 if((src.size() % 4 )!= 0 )
        {
                return 0;
        }

 unsigned char in[4];
 unsigned char out[3];

 size_t blocks = src.size()/4;
 for ( size_t i=0; i<blocks; i++ ) {
  in[0] = src[i*4];
  in[1] = src[i*4+1];
  in[2] = src[i*4+2];
  in[3] = src[i*4+3];
  _deBase6 4Help(in,out);
  outbuf[i*3]   = out[0];
  outbuf[i*3+1] = out[1];
  outbuf[i*3+2] = out[2];
 }
 int length = src.size() / 4 * 3;
 if ( src[src.size()-1] == '=' ) {
  length--;
  if ( src[src.size()-2] == '=' ) {
   length--;
  }
 }
 return length;
}
string CConvert::deBase6 4( string src)
{
        char * buf=new char[src.length()*2];
        int len=deBase6 4(src,buf);
        buf[len]='\0';
        string result=string(buf,len);
        delete [] buf;
        return result;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有