base64编码和解码

来源:互联网 发布:java 读取文件名称 编辑:程序博客网 时间:2024/05/17 20:32

引用:百度百科 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;}



原创粉丝点击