C++base64字符串转换
2016-03-04 10:28
429 查看
C++base64字符串转换
|下面是头文件定义:
#ifndef _BASE64_H_
#define _BASE64_H_
#include<string>
using namespace std;
//#include <conf.h>
class CBase64Coder
{
private :
static char ch64[];
char* buf;
int size ;
private :
static int BinSearch(char p);
void allocMem(int NewSize);
public :
CBase64Coder();
~CBase64Coder();
const char* encode(const string& message);
const char* encode(const char* buffer,int buflen);
const char* decode(const char* buffer,int Length);
};
#endif
下面是类方法实现:
#include "CBase64Coder.h"
char CBase64Coder::ch64[] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/','='
};
CBase64Coder::CBase64Coder()
{
buf = NULL;
size = 0 ;
}
CBase64Coder::~CBase64Coder()
{
if ( buf )
free(buf);
}
void CBase64Coder::allocMem(int NewSize)
{
if ( buf )
buf = (char*)realloc(buf,NewSize);
else
buf = (char*)malloc(NewSize);
memset(buf,0,NewSize);
}
const char* CBase64Coder::encode(const string& buffer)
{
return encode(buffer.c_str(),buffer.length());
}
const char* CBase64Coder::encode(const char* buffer,int buflen)
{
int nLeft = 3 - buflen%3 ;
//根据BASE64算法,总长度会变成原来的4/3倍
//所以内存分配=length*4/3并加1位作为结束符号(0)
allocMem(( buflen + nLeft )*4/3+1);
//临时变量,
char ch[4];
int i ,j;
for ( i = 0 ,j = 0; i < ( buflen - buflen%3 ); i += 3,j+= 4 )
{
ch[0] = (char)((buffer[i]&0xFC) >> 2 );
ch[1] = (char)((buffer[i]&0x03) << 4 | (buffer[i+1]&0xF0) >> 4 );
ch[2] = (char)((buffer[i+1]&0x0F) << 2 | (buffer[i+2]&0xC0) >> 6 );
ch[3] = (char)((buffer[i+2]&0x3F));
//查询编码数组获取编码后的字符
buf[j] = ch64[ch[0]];
buf[j+1] = ch64[ch[1]];
buf[j+2] = ch64[ch[2]];
buf[j+3] = ch64[ch[3]];
}
if ( nLeft == 2 )
{
ch[0] = (char)((buffer[i]&0xFC) >> 2);
ch[1] = (char)((buffer[i]&0x3) << 4 );
ch[2] = 64;
ch[3] = 64;
//查询编码数组获取编码后的字符
buf[j] = ch64[ch[0]];
buf[j+1] = ch64[ch[1]];
buf[j+2] = ch64[ch[2]];
buf[j+3] = ch64[ch[3]];
}
else if ( nLeft == 1 )
{
ch[0] = (char)((buffer[i]&0xFC) >> 2 );
ch[1] = (char)((buffer[i]&0x03) << 4 | (buffer[i+1]&0xF0) >> 4 );
ch[2] = (char)((buffer[i+1]&0x0F) << 2 );
ch[3] = 64;
//查询编码数组获取编码后的字符
buf[j] = ch64[ch[0]];
buf[j+1] = ch64[ch[1]];
buf[j+2] = ch64[ch[2]];
buf[j+3] = ch64[ch[3]];
}
return buf;
}
const char* CBase64Coder::decode(const char* buffer,int Length)
{
int length = Length;
if ( length%4 != 0 )
return NULL;
allocMem(length*3/4 + 1);
char p;
char ch[4];
int i , j ;
for ( i = 0 , j = 0 ; i < length ; i += 4 , j+= 3)
{
for ( int z = 0 ; z < 4 ; z++)
{
//采用2分法查找
p = (char)BinSearch(buffer[i+z]);
if ( p == -1 )
return NULL;
ch[z] = p;
}
buf[j] = (char)((ch[0]&0x3F) << 2 | (ch[1]&0x30) >> 4 );
buf[j+1] = (char)((ch[1]&0xF) <<4 | (ch[2]&0x3C) >>2 );
buf[j+2] = (char)((ch[2]&0x03) << 6 | (ch[3]&0x3F));
}
return buf;
}
//采用二分法查找p在ch64数组中的位置,并返回。如果找不到则返回-1
int CBase64Coder::BinSearch(char p)
{
if ( p >= 'A' && p <= 'Z' )
return (p - 'A');
else if ( p >= 'a' && p <= 'z' )
return (p - 'a' + 26);
else if ( p >= '0' && p <= '9' )
return (p - '0' + 26 + 26);
else if ( p == '+' )
return 62;
else if ( p == '/' )
return 63;
else if ( p == '=' )
return 64;
return -1;
}
参考:c++ base64 百度
相关文章推荐
- C++语言-09-多任务
- 【C++】延时调用的其中两种实现
- 1098. Insertion or Heap Sort (25)
- VC++控制台程序中使用定时器
- 《Effective C++》Rule 41: 了解隐式接口和编译期多态
- 关于C语言%u
- C语言位运算详解( 稳固下C吧)
- C语言——预编译
- 读书笔记之:C++ Primer (第4版)及习题(ch01-ch11)
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 贪吃蛇游戏的C语言实现
- c++知识点
- C++构造函数
- Microsoft Visual C++ 和 Borland C++ Builder 之比较
- 玩具侠-C语言学习之函数指针(2)
- C语言深度剖析-----内存管理的艺术
- [C语言][LeetCode][21]Merge Two Sorted Lists
- c++ socket 客户端库 socks5 客户端 RudeSocket™ Open Source C++ Socket Library
- 三种工厂模式的分析以及C++实现
- C++栈(stack)