首页 > 代码库 > base64编解码

base64编解码

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节。
规则
关于这个编码的规则:
①.把3个字符变成4个字符。
②每76个字符加一个换行符。
③.最后的结束符也要处理。
例子:
转换前 10000001, 10000001, 10000001 (二进制)
转换后 00100000, 00010000, 00001100, 0000001 (二进制)

Base64编码表

码值字符 码值字符 码值字符 码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/
C语言实现:

static const char s_acBase64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";



/*
* 函数名称:	Base64Encode
* 函数功能:	base64编码
* 参    数:
* 			pucIN					-	编码前数据
* 			ulINLen					-	编码前数据长度
* 			pucOUT					-	编码后数据
* 			pucOUTLen				-	编码后数据长度
* 返 回 值:		成功返回R__OK,否则返回相应错误码
*/
unsigned int Base64Encode(const unsigned char *pucIN,  unsigned long ulINLen, unsigned char *pucOUT, unsigned long *pulOUTLen)
{
	if (NULL == pucIN || NULL == pucOUT || NULL == pulOUTLen)
	{
		return -1;
	}

	unsigned long i, len2, leven;
	unsigned char *p;
	len2 = 4 * ((ulINLen + 2) / 3);
	if (*pulOUTLen < len2 + 1)
	{
		*pulOUTLen = len2 + 1;
		return -2;
	}
	p = pucOUT;
	leven = 3*(ulINLen / 3);
	for (i = 0; i < leven; i += 3)
	{
		*pucOUT++ = s_acBase64[(pucIN[0] >> 2) & 0x3F];
		*pucOUT++ = s_acBase64[(((pucIN[0] & 3) << 4) + (pucIN[1] >> 4)) & 0x3F];
		*pucOUT++ = s_acBase64[(((pucIN[1] & 0xf) << 2) + (pucIN[2] >> 6)) & 0x3F];
		*pucOUT++ = s_acBase64[pucIN[2] & 0x3F];
		pucIN += 3;
	}
	if (i < ulINLen)
	{
		unsigned a = pucIN[0];
		unsigned b = (i+1 < ulINLen) ? pucIN[1] : 0;

		*pucOUT++ = s_acBase64[(a >> 2) & 0x3F];
		*pucOUT++ = s_acBase64[(((a & 3) << 4) + (b >> 4)) & 0x3F];
		*pucOUT++ = (i+1 < ulINLen) ? s_acBase64[(((b & 0xf) << 2)) & 0x3F] : '=';
		*pucOUT++ = '=';
	}
	*pucOUT = '\0';
	*pulOUTLen = pucOUT - p;
	return 0;
}