字符串转base64

来源:互联网 发布:阿里云备案拍照点 编辑:程序博客网 时间:2024/04/29 21:02

一、Base64简介

Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!
0~63对应到ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

二、字符串转Base64原理

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。



三、C++代码实现
思路:
第一个输出字节:取第一输入字节的前6位,并且在高位补0,使其变成8位(一个字节)
第二个输出字节:取第一输入字节的后2位和第二个输入字节的前4位(共6位),并且在高位补0,使其变成8位(一个字节)
第三个输出字节:取第二输入字节的后4位和第三个输入字节的前2位(共6位),并且在高位补0,使其变成8位(一个字节)
第四个输出字节:取第三输入字节的后6位,并且在高位补0,使其变成8位(一个字节)

char* src = "ABC";int len = strlen(src);int nLeft = 3 - len % 3;char* dst = (char*)malloc((len+nLeft) * 4 / 3 + 1);str2base64(src, dst);cout << dst << endl;转换函数:void str2base64(char* src, char* dst){        static char base64Index[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";        int len = strlen(src);        int nLeft = 3 - len % 3;        char e[4];        int i, j;        for (i = 0, j = 0;i < (len - len % 3); i+=3, j+=4)        {                e[0] = src[i] >> 2;                e[1] = (src[i] & 0x03) << 4 | (src[i + 1] >> 4);                e[2] = (src[i + 1] & 0x0f) << 2 | (src[i + 2] >> 6);                e[3] = src[i + 2] & 0x3f;                dst[j    ] = base64Index[e[0]];                dst[j + 1] = base64Index[e[1]];                dst[j + 2] = base64Index[e[2]];                dst[j + 3] = base64Index[e[3]];        }        if (nLeft == 2)        {                e[0] =  src[i] >> 2;                e[1] = (src[i] & 0x03) << 4;                dst[j] = base64Index[e[0]];                dst[j + 1] = base64Index[e[1]];                dst[j + 2] = dst[j + 3] = '=';                dst[j + 4] = '\0';        }        else if(nLeft == 1)        {                e[0] =  src[i] >> 2;                e[1] = (src[i] & 0x03) << 4 | (src[i + 1] >> 4);                e[2] =  (src[i + 1] & 0x0f) << 2;                dst[j    ] = base64Index[e[0]];                dst[j + 1] = base64Index[e[1]];                dst[j + 2] = base64Index[e[2]];                dst[j + 3] = '=';                dst[j + 4] = '\0';        }        else        {                dst[j] = '\0';        }}

参考资料:
---
[1]base64--百度百科
[2] Base64 编码介绍、Base64编码转换原理、算法
[3] C++base64字符串转换  
[4]Base64编码/解码


0 0
原创粉丝点击