C++ 实现Base64编码

Base64编码

是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法,Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

编码实现过程
想要实现对字符串的base64编码,首先肯定要知道它的编码过程,在进行编码前首先要设置码表

const u_char base64tab[64] =
{
 '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','+','/'
};

可以看出它的码表一共有64个字符,现在就能理解他为什么叫base64了,有了编码的对照码表,我们现在就可以深究它的编码计算过程了,首先假设我们现在有一个明文字符串"ABC"那按照base64的标准,该如何进行编码呢?首先我们知道在这串字符串中一个字符占一个字节,一共三个字节,每个字节八位,一共是三组八位共24位二进制数,现在我们需要吧这24位二进制数拆成每组六个字节,一共4组的一串数据就像这样
在这里插入图片描述这样一来就把明文的二进制码拆开了,拆开后是六位二进制数,要放入内存必须要一个字节才行,那就再每个六位二进制数前面加两个0刚好凑够一个字节

现在还有一共问题,那就是三个字节的字符串刚好可以拆成四组,那不是三个字节的字符串,或字符个数不是三的倍数的字符串怎么编码呢?当然也有办法,如果有一个字符串一共长12个字节,那我们分成四组三个字节的短字符串,按组来处理就好了。那假如是一个13个字节的字符串呢,13不是3的倍数,那又该怎么分组呢,首先3的倍数基本上是每隔两个数就会出现一次,那就先按12来算,可以分成四组,最后一组不足三个字节,如果剩余一个字符,那就补两个“==”字符串,同样的假如剩余两个字符那就补一个“=”
如图所示
在这里插入图片描述假设是字符串“ABCE"编码过程大致就是这样,同样也是分为每组6个后方便存入内存,在高位补两位0。

在这里我们新转换到的数字并不是base64密文的ascii码,这里获取到的数字是一个索引下标,没错就是我们刚刚设置的那个有64个字符的base64编码表的下标,我们根据算出的小标就能找到密文对应的字符,再将这些字符存入字符串就得到了一串base64编码的字符串,要注意的是最后一组如果不够三个字节,补上去的两个或一个“=”不参与编码位运算

代码实现
首先在C++中最小的存储单位是字节,所以我们无法直接将每一位拆开重组,那如何将字节中的每一位拆分重组呢?没错就是位移运算

string Base64::Base64Encode
(
	_In_ string tsrc,
	_In_ u_long srcsize 
)
{
	const u_char* src = (const u_char*)tsrc.c_str();
	u_char* tempBuff = new u_char[3];
	string destStr;
	//取到最后剩几个数据
	int lastNumb = srcsize % 3;

	//分为三组处理
	int i;
	for (i = 0; i < (srcsize / 3); i++)
	{
		memset(tempBuff, 0x00, 3);
		memcpy(tempBuff, (src+i*3), 3);

		destStr += base64tab[(tempBuff[0] >> 2)];
		destStr += base64tab[(((tempBuff[0] & 0x03) << 4) | (tempBuff[1] >> 4))];
		destStr += base64tab[(((tempBuff[1] & 0x0f) << 2) | (tempBuff[2] >> 6))];
		destStr += base64tab[(tempBuff[2] & 0x3f)];
	}
	//剩余不够一组的数据处理
	if (lastNumb == 1)
	{
		memset(tempBuff, 0x00, 3);
		memcpy(tempBuff, (src + i * 3), 1);
		destStr += base64tab[(tempBuff[0] >> 2)];
		destStr += base64tab[(tempBuff[0] & 0x03) << 4];
		destStr.append("==");
	}
	if (lastNumb == 2)
	{
		memset(tempBuff, 0x00, 2);
		memcpy(tempBuff, (src + i * 3), 2);
		destStr += base64tab[(tempBuff[0] >> 2)];
		destStr += base64tab[(((tempBuff[0] & 0x03) << 4) | (tempBuff[1] >> 4))];
		destStr += base64tab[((tempBuff[1] & 0x0f) << 2)];
		destStr.append("=");
	}
//释放内存
	delete[] tempBuff;
	return destStr;
}

z我这里实现了一个base64编解码的类,在类中实现了一个静态函数,完整项目代码已上传github,地址在最后
对于解码,就是对编码的逆运算,没有什么好说的,
可以参考这篇文章,个人感觉解码效率还挺高
Base64编解码及其C++实现 原创
这种方法感觉效率很高,可以参考

完整项目地址github:
CppFastSolution

猜你喜欢

转载自blog.csdn.net/weixin_43815930/article/details/105101359