base64编解码

最近搞邮箱通信程序发现邮件内容都是经过base64编码的,当然不乏在线编解码的网站,

例如http://blbear.com/tools/base64-utf8.php

在这里也提供个程序实现base64的编解码功能:


base64.h

#ifndef _BASE64_H_
#define _BASE64_H_

extern int base64_encode(const void *data, int size, char **str);
extern int base64_decode(const char *str, void *data);

#endif

base64.cpp

///
//base64
///
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include "base64.h"

static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static int pos(char c)
{
  char *p;
  for(p = base64; *p; p++)
    if(*p == c)
      return p - base64;
  return -1;
}

int base64_encode(const void *data, int size, char **str)
{
  char *s, *p;
  int i,c;
  unsigned char *q;

  p = s = new char [size*4/3+4];
  if(p == NULL)
      return -1;
  q = (unsigned char*)data;
  i=0;
  for(i = 0; i < size;)
  {
    c=q[i++];
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    c*=256;
    if(i < size)
      c+=q[i];
    i++;
    p[0]=base64[(c&0x00fc0000) >> 18];
    p[1]=base64[(c&0x0003f000) >> 12];
    p[2]=base64[(c&0x00000fc0) >> 6];
    p[3]=base64[(c&0x0000003f) >> 0];
    if(i > size)
      p[3]='=';
    if(i > size+1)
      p[2]='=';
    p+=4;
  }

  *p=0;
  *str = s;
  return strlen(s);
}

int base64_decode(const char *str, void *data)
{
  const char *p;
  unsigned char *q;
  int c,x,done=0;

  q=(unsigned char*)data;
  for(p=str; *p && !done; p+=4)
  {
    x = pos(p[0]);
    if(x >= 0)
      c = x;
    else
	{
      done = 3;
      break;
    }
    c*=64;
    
    x = pos(p[1]);
    if(x >= 0)
      c += x;
    else
      return -1;
    c*=64;
    
    if(p[2] == '=')
      done++;
    else
	{
      x = pos(p[2]);
      if(x >= 0)
		  c += x;
      else
		  return -1;
    }
    c*=64;
    
    if(p[3] == '=')
      done++;
    else
	{
      if(done)
		  return -1;
      x = pos(p[3]);
      if(x >= 0)
		  c += x;
      else
		  return -1;
    }
    if(done < 3)
      *q++=(c&0x00ff0000)>>16;
      
    if(done < 2)
      *q++=(c&0x0000ff00)>>8;
    if(done < 1)
      *q++=(c&0x000000ff)>>0;
  }
  return q - (unsigned char*)data;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值