引用:百度百科
base64编码
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
-----------------------------------------------------------------------------------------------------------------------------------------------
base64编码,现在都有很多库可以直接实现,这里只是自己熟悉下base64是如何编码和解码的。
编码字节表示
百科里有详细介绍base64是如何截取字节位的,这里是一个简图。红色框内是原始字节位表示,黑色表示组合后的。都是在6位前补00组成一个字节。
解码字节位表示。
c语言代码。简略描述编码解码过程,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义base64解码表,最后一个是字符串结尾标志
static char Base64Code[] = {'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','+','/','=','\0'};
//编码
char* enbase(char *buf)
{
//字符数组的长度,传入的字符串默认有'\0'结束符,如果直接传入字节,应该自定义 传入一个len长度
int length=strlen(buf);
//指针引用
char* debase,*p;
//声明内存,解码时,转换后长度和原始长度关系为 length/3*4
p=debase=malloc((length%3==0?length/3*4:(length/3+1)*4)*sizeof(char));
int i;
//声明几个辅助变量
char b1,b2,b3,temp;
//3次进行一次迭代
for (i=0;i<length;i=i+3){
b1=buf[i];
//第一个字节转换,右移动2位,与0x3f保证头2位字节为0
*(p++)=Base64Code[((b1>>2)&0x3f)];
/*检测第二个字节是否存在,没有补0*/
b2=(i+1)>=length?0:buf[i+1];
/*第一字节左移4位,加上第二字节右移4位,同时其他位字节抛弃*/
*(p++)=Base64Code[(((b1<<4)&0x3f)+((b2>>4)&0xf))];
/*同样是检测第3个字节是否存在,补0*/
b3=(i+2)>=length?0:buf[i+2];
/*第2个字节左移2位,加上第3字节右移6位*/
temp=b2==0?64:(((b2<<2)&0x3f)+((b3>>6)&0x3));
*(p++)=Base64Code[temp];
/*第3字节与0x3f取低6位*/
*(p++)=Base64Code[b3==0?64:(b3&0x3f)];
}
*(p)='\0';
return debase;
}
/*根据码表取索引*/
char getIndex(char c,char* buf)
{
int i;
for (i=0;i<strlen(buf);++i){
if (c==buf[i]){return i;}
}
return 0;
}
/*解码*/
char* debase(char* buf)
{
/*辅助变量*/
char b1,b2,b3,b4;
int i;
/*strlen在传入字符串有'\0'下正常获取长度*/
int length=strlen(buf);
char* debase,*p;
/* 声明内存,转换后长度和输入长度关系为length/4*3 */
p=debase=malloc((length/4*3)*sizeof(char));
for (i=0;i<length;i=i+4){
/*获取对应字节的索引值*/
b1=getIndex(buf[i],Base64Code);
b2=getIndex(buf[i+1],Base64Code);
b3=getIndex(buf[i+2],Base64Code);
b4=getIndex(buf[i+3],Base64Code);
/*第一字节左移2位,加上第二字节右移4位*/
*(p++)=((b1<<2)+((b2>>4)&0x3));
if (b3!=64){
/*
base64编码,编码的过程就保证了,只有第三位和第四为可能为=号,就是=号最多有2个。
当第三字节不为=号时,取 第二字节左移4位加第三字节右移2位
*/
*(p++)=((b2&0x0f)<<4)+((b3>>2)&0xf);
if (b4!=64){
/*第三字节左移6位*/
*(p++)=((b3<<6)+b4);
}
}
}
/*最后补0 字符串结尾*/
*(p)='\0';
return debase;
}