base64初探
来源:互联网 发布:免费电子相册制作软件 编辑:程序博客网 时间:2024/05/01 12:30
申明:本文部分内容为网络相关资料整理,并结合本人实际工作总结而成。请引用或者转载注明出处,对于文章内容有疑问请留言。
一、原理
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,缓冲区中剩下的bit用0补足。然后,每次取出6(因为2^6=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个byte,在编码结果后加1个=;如果最后剩下一个byte,编码结果后加2个=;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
二、示例
三、代码(借鉴)
/** * * base64 编码/解码 未进行任何数据检查 * * */ #include <iostream>#include <string>#include <map> using namespace std; static char encode[64]={'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','+','/'};static map<char,unsigned> decode; void initData(){ for (unsigned i(0);i!=64;++i){ decode[encode[i]]=i; }} // base64编码,三变四void encodeAppend(const string::const_iterator& it, string& str){ unsigned raw(((unsigned)*it & 0xff)<<16 | ((unsigned)*(it+1) & 0xff)<<8 | ((unsigned)*(it+2) & 0xff)); for (int i(18);i>=0;i-=6){ str+=encode[raw>>i & 63]; }} string& base64Encode(string strRaw,string& str){ str.clear(); // 补'='个数 unsigned plusEq(0); // 补0到长度为3的倍数 while (strRaw.size() % 3){ strRaw+=(char)0; ++plusEq; } string::const_iterator it(strRaw.begin()); unsigned count(0); while (it != strRaw.end()){ encodeAppend(it,str); // 每76个字符换行,每次增加4个字符所以每19轮换行一次 if (++count%19 == 0){ str+='\n'; } it+=3; } // 修改'=' while (plusEq){ str[str.size()-plusEq]='='; --plusEq; } return str;} // base64解码,四变三void decodeAppend(const string::const_iterator& it,string& str){ unsigned raw(decode[*it]<<18 | decode[*(it+1)]<<12 | decode[*(it+2)]<<6 | decode[*(it+3)]); for (int i(16);i>=0;i-=8){ str+=(char)(raw>>i); }} string& base64Decode(const string& strRaw,string& str){ str.clear(); for (string::const_iterator it(strRaw.begin());it!=strRaw.end();it+=4){ decodeAppend(it,str); } return str;} int main(){ initData(); string strRaw,str; cout<<endl<<"输入原码:"<<endl; getline(cin,strRaw); cout<<"base64 Encode:"<<endl <<base64Encode(strRaw,str)<<endl; cout<<endl<<"输入base64:"<<endl; getline(cin,strRaw); cout<<"base64 Decode:"<<endl <<base64Decode(strRaw,str)<<endl; return 0;}
阅读全文
0 0
- base64初探
- base64
- BASE64
- Base64
- BASE64
- Base64
- Base64
- base64
- base64
- base64
- base64
- base64
- Base64
- base64
- base64
- Base64
- BASE64
- Base64
- EditText 光标颜色
- [leetcode]#169. Majority Element
- JVM(四)JVM内存划分
- itext导出报表防止内存溢出
- Ceph 入门——内部构件
- base64初探
- C++学习笔记--字符串类
- Spring使用BeanName视图产生Excel视图
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- STM32 F103 NandFlash的配置使用
- RabbitMQ基础概念详细介绍
- 国内优质原创内容输出平台
- HttpContext, HttpRequest, HttpResponse 常用对象摘要
- linux系统资源查看