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;
}