1、base64是将通用的16进制数据每6bit一个单位,转换为字母的方式。例如现有3个字节数据:0x00 , 0x11 , 0x22 ,其二进制为:00000000 00010001 00100010,将每6bit为一组,则是:
000000 000001 000100 100010 在将每6bit前面补00,则为
00000000 00000001 00000100 00100010,根据数字查表为
A B E i
若不够6bit的,差2bit在后面加00,转换后加一个=号,若差4bit加0000,转换后加两个=。
2、编码解码base64.cpp:
#include <stdio.h>
#include "base64.h"
static const char s_Base64Table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
static const unsigned char s_Base64Map[256] =
{
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 62 , 255 , 255 , 255 , 63 ,
52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 255 , 255 , 255 , 254 , 255 , 255 ,
255 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 ,
15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 255 , 255 , 255 , 255 , 255 ,
255 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 ,
41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
} ;
/**
* @brief base64编码,将无符号数据转换为base64
*
* @param pSrc : 需要转换的无符号数据指针
* pDst : 存放转换结果的base64数据指针
* nSrcLen : 需要转换的数据长度
**/
int Base64_Encode(const unsigned char * pSrc , unsigned char * pDst , int nSrcLen)
{
if (NULL == pSrc || 0 == nSrcLen) { return -1 ; }
unsigned char c1, c2, c3;
unsigned int nDstLen = 0 , nDiv = nSrcLen / 3 , nMod = nSrcLen % 3 ;
for(unsigned int i = 0 ; i < nDiv ; i ++)
{
c1 = * pSrc ++ ; c2 = * pSrc ++ ; c3 = * pSrc ++ ;
*pDst++ = s_Base64Table[c1 >> 2];
*pDst++ = s_Base64Table[((c1 << 4) | c2 >> 4) & 0x3f];
*pDst++ = s_Base64Table[((c2 << 2) | c3 >> 6) & 0x3f];
*pDst++ = s_Base64Table[c3 & 0x3f];
nDstLen += 4 ;
}
if (1 == nMod){
*pDst++ = s_Base64Table[(*pSrc) >> 2];
*pDst++ = s_Base64Table[((*pSrc) << 4) & 0x3f];
*pDst++ = '=' ; *pDst++ = '=' ;
nDstLen += 4 ;
}
else if(2 == nMod)
{
c1 = * pSrc ++ ; c2 = * pSrc ++;
*pDst++ = s_Base64Table[c1 >> 2];
*pDst++ = s_Base64Table[((c1 << 4) | c2 >> 4) & 0x3f];
*pDst++ = s_Base64Table[c2 >> 2];
*pDst++ = '=';
nDstLen += 4;
}
*pDst = '\0';
return nDstLen;
}
/**
* @brief base64解码,将base64转换为无符号数据
*
* @param pSrc : 需要转换的base64数据指针
* pDst : 存放转换结果的无符号数据指针
* nSrcLen : 需要转换的数据长度
**/
int Base64_Decode(const unsigned char * pSrc , unsigned char * pDst , int nSrcLen)
{
if (NULL == pSrc || 0 == nSrcLen){ return -1 ; }
unsigned char pc ;
unsigned long int nDstLen = 0 , dc = 0 , nc = 0 , ncode = 0;
for(int i = 0 ; i < nSrcLen ; i++)
{
pc = s_Base64Map[*pSrc++];
if (pc == 0xFF) { continue ; }
if (pc == 0xFE) { pc = 0 ; dc ++ ; }
ncode = (ncode << 6) | pc;
if(++ nc == 4)
{
* pDst ++ = (unsigned char)(ncode >> 16 & 0xFF) ;
nDstLen ++ ;
if (dc < 2)
{
* pDst ++ = (unsigned char)((ncode >> 8) & 0xFF) ;
nDstLen ++ ;
}
if (dc < 1)
{
* pDst ++ = (unsigned char)(ncode & 0xFF);
nDstLen ++ ;
}
nc = 0 ; ncode = 0 ;
}
}
return nDstLen;
}
/**
* @brief base64编码解码函数调用例子
**/
void Base64_Example(void)
{
unsigned char src[10] = {0x00 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66 , 0x77 , 0x88 , 0x99} ;
unsigned char dst[20] = {0x00} ;
Base64_Encode(src , dst , 10) ;
printf("%s\n" , dst) ;
Base64_Decode((unsigned char *)"ABEiM0RVZneImQ==" , dst , 16) ;
for(int i = 0 ; i < 10 ; ++ i) printf("%X , " , dst[i]) ;
}
头文件base64.h:
#ifndef _BASE64_H_
#define _BASE64_H_
/**
* @brief base64编码,将无符号数据转换为base64
*
* @param pSrc : 需要转换的无符号数据指针
* pDst : 存放转换结果的base64数据指针
* nSrcLen : 需要转换的数据长度
**/
int Base64_Encode(const unsigned char * pSrc , unsigned char * pDst , int nSrcLen) ;
/**
* @brief base64解码,将base64转换为无符号数据
*
* @param pSrc : 需要转换的base64数据指针
* pDst : 存放转换结果的无符号数据指针
* nSrcLen : 需要转换的数据长度
**/
int Base64_Decode(const unsigned char * pSrc , unsigned char * pDst , int nSrcLen) ;
/**
* @brief base64编码解码函数调用例子
**/
void Base64_Example(void) ;
#endif // _BASE64_H_
3、测试用例main.cpp:
#include <iostream>
#include <stdio.h>
#include "base64.h"
using namespace std;
int main()
{
Base64_Example() ;
return 0;
}