简介
base64编码根据编码表将一段二进制数据映射成64个可显示字母和数字组成的字符集合,主要用于传送图形、声音等非文本数据。
标准 base64 编码表
编码原理
原理
下面我们通过将明文 “abc”
进行 base64 编码来讲解 base64 编码原理。
1.首先将明文每三个字节分为一组,每个字节8bit,共24bit。
2.将24bit划分为四组,每组6bit,4组共24bit
3.将每组用0补齐为8bit,4组共32bit。
黄色部分就是补齐的0。
将补齐后的二进制数的十进制值作为编码表的下标获取编码表中的对应值。
编码结果就是 “YWJj”
如果编码后的字符不是4的倍数,后面用 “=” 填充补齐。
代码实现
//定义一个常量指针指向一个常量字符串
const char * const table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
//data是用于指向需要编码的常量数据的指针
//base64指针指向一块内存用于存储编码后的basse64字符串
//length是输入数据的长度
char * encode( const unsigned char * data, char * base64, int length )
{
//用于遍历输入数据和base64字符
int i, j;
//用于存储当前处理的字符
unsigned char current;
//循环遍历输入数据,每次处理3个字节
for ( i = 0, j = 0 ; i < length ; i += 3 ){
//获取第一个字节的前六位
current = (data[i] >> 2) ;
//与0x3f进行按位与操作,取字节前6位
//0x3f=00111111
current &= (unsigned char)0x3F;
//使用编码表数组将结果映射为base64字符,并将结果存储在输出指针中
base64[j++] = table[(int)current];
//将第一个字节左移4位,与0x30按位与,取其后2位
//0x30=00110000
current = ( (unsigned char)(data[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
//如果没有第二个(即输入长度不足2个字节),则直接填充“=”字母并返回
if ( i + 1 >= length )
{
base64[j++] = table[(int)current];
base64[j++] = '=';
base64[j++] = '=';
break;
}
//第二个字节右移4位,取其前4位,与之前第一个字节后两位合并
//00110000
//或
//00001111
current |= (