base64编码__C语言

Base64编码

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。–来源于百度百科

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//base64表
unsigned char *base64_table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

int index(char c)
{
    if(c>= 'A' && c<='Z')
        return c-'A';
    else if(c>= 'a' && c<= 'z')
        return c-'a'+26;
    else if(c>= '0' && c<= '9')
        return c-'0'+52;
    else if(c == '+')
        return 62;
    else if(c == '/')
        return 63;
    return -1;
}
//解码
unsigned char* base64_decode(char *str)
{
    unsigned char *de_str;
    int str_len;    //原始字符处的长度
    int de_len;     //解码后字符串的长度

    str_len = strlen(str);


    if(strstr(str,"=="))
        de_len=str_len/4*3-2;
    else if(strstr(str,"="))
        de_len=str_len/4*3-1;
    else
        de_len=str_len/4*3;

    //为解码后的字符串申请空间
    de_str =malloc(sizeof(unsigned char)*de_len+1);
    de_str[de_len] = '\0';

    for(int i=0,j=0;i < str_len-2; i+=4,j+=3)
    {
    de_str[j]=((unsigned char)index(str[i]))<<2 | (((unsigned char)index(str[i+1]))>>4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合
    de_str[j+1]=(((unsigned char)index(str[i+1]))<<4) | (((unsigned char)index(str[i+2]))>>2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合
    de_str[j+2]=(((unsigned char)index(str[i+2]))<<6) | ((unsigned char)index(str[i+3])); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
    }

    //因为解码的时候数组其实已经越界了,所以最后再用'\0'截断字符串
    de_str[de_len] = '\0';

    return de_str;
}

//编码
unsigned char * base64_encode(char *str)
{
    unsigned char * en_str;
    int str_len;    //原始字符串长度
    int en_len;     //编码后的字符串长度
//计算经过base64编码后字符串长度
    str_len = strlen(str);
    if(str_len % 3 ==0)
        en_len =(str_len/3)*4;
    else
        en_len = (str_len/3+1)*4; //不够3,补齐到3.

    //为加密后字符串申请存储空间, +1是设置最后一位为\0
    en_str = malloc(sizeof(unsigned char)*en_len+1);
    en_str[en_len] ='\0';

    /*这里有一个补位问题.当最后只剩一下一个字符的时候.
    如 str[j]=01101011 这个时候只能确定第一个字符 011010 还剩下 11.
    刚开始思考怎么用0补充后面的呢.突然想到C语言最后用'\0'结尾都是0刚好可以补位0
    str[j+1]就指向的是'\0'这个地方.所以可以完成补位.然后算出来的str[j+2]和str[j+3]的值是不确定的
    最后用==号填充就好了
    */
    for(int i=0,j=0;i<en_len-2;j+=3,i+=4)
    {
        en_str[i] = base64_table[str[j]>>2];    //取出第一个字符的前六位
        en_str[i+1] = base64_table[(str[j]&0x03)<<4 | (str[j+1]>>4)]; //第一个字符的后两位和第二个字符的前四位
        en_str[i+2] = base64_table[(str[j+1]&0xf)<<2 | (str[j+2]>>6)];//第二个字符的后四位和第三个字符的前两位
        en_str[i+3] = base64_table[str[j+2]&0x3f];  //第三个字符的后六位
    }
    if(str_len % 3==1) //如果凑不够3,则最后两个用=号补充.
    {
        en_str[en_len-2] = '=';
        en_str[en_len-1] = '=';
    }
    else if(str_len % 3 ==2)
    {
        en_str[en_len-1] = '=';
    }
    return en_str;
}
int main()
{
    char *a ="hello world10e";
    char *b ="a";
    char *c =a;
    printf("%x\n",c[1]);
    c =base64_encode(a);
    printf("%s\n",c);
    c =base64_decode(c);
    printf("%s\n",c);
    printf("%s\n",base64_encode(b));
    printf("%s\n",base64_encode(a));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值