hi3516a——base64編碼解析

前言

Base64是網絡上最常見的用於傳輸8Bit字節碼的編碼方式之一,Base64就是一種基於64個可打印字符來表示二進制數據的方法。網上看到兩篇文章總結的不錯,可參考以下兩文章。
https://www.cnblogs.com/libin-1/p/6165485.html
https://www.cnblogs.com/antineutrino/p/3756106.html
無私分享,從我做起!

C語言源碼

base64編碼索引表:
在這裏插入圖片描述

//char *in, const int in_len爲輸入的數據,char *out, int out_len爲依據base64轉換後的數據
void base64_encode(char *in, const int in_len, char *out, int out_len)
{
	static const char *codes ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	int base64_len = 4 * ((in_len+2)/3);
	//把輸入的長度加2,除以3後取整,再乘以4,得到編碼後的數據長度,例如5個字節編碼後是8個字節;加以2取整是爲了包括多出來1個字節和2個字節的情況
	char *p = out;
	int times = in_len / 3;
	int i;
	
	out_len=base64_len;
	for(i=0; i<times; ++i)    //輸入長度剛好是3的倍數
	{
		*p++ = codes[(in[0] >> 2) & 0x3f];//第一字節右移兩位,去掉低2位,高2位補零
		*p++ = codes[((in[0] << 4) & 0x30) + ((in[1] >> 4) & 0xf)];//源第一字節低2位 + 源第2字節高4位
		*p++ = codes[((in[1] << 2) & 0x3c) + ((in[2] >> 6) & 0x3)];//第二個字節去掉高4位並左移兩位(得高6位),第三個字節右移6位並去掉高6位(得低2位),相加
		*p++ = codes[in[2] & 0x3f]; //源第三字節去掉高2位
		in += 3; //轉完3個字節,加3
	}
	if(times * 3 + 1 == in_len) //輸入長度是3個倍數多一位
	{
		*p++ = codes[(in[0] >> 2) & 0x3f];
		*p++ = codes[((in[0] << 4) & 0x30) + ((in[1] >> 4) & 0xf)];
		*p++ = '=';   //補齊=
		*p++ = '=';  //補齊=
	}
	if(times * 3 + 2 == in_len) //輸入長度是3個倍數多兩位
	{
		*p++ = codes[(in[0] >> 2) & 0x3f];
		*p++ = codes[((in[0] << 4) & 0x30) + ((in[1] >> 4) & 0xf)];
		*p++ = codes[((in[1] << 2) & 0x3c)];
		*p++ = '='; //補齊=
	}
	*p = 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章