base64编码解码

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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值