base64编码和解码


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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值