base64编解码的两个函数(安全版本)
void base64_encode_s(const unsigned char *str, long inlen, std::string& outstr, long* lpBufLen)
{
long len;
long str_len;
//unsigned char *res;
//std::shared_ptr<std::string> res;
int i,j;
//定义base64编码表
const unsigned char *base64_table = (const unsigned char *)("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); //计算经过base64编码后的字符串长度
str_len= inlen;
if(str_len % == )
len=str_len/*;
else
len=(str_len/+)*; if (NULL != lpBufLen) {
*lpBufLen = len;
} //std::shared_ptr<std::string> res(new std::string(sizeof(unsigned char)*len+1)); //(unsigned char *)malloc(sizeof(unsigned char)*len+1);
outstr.resize(sizeof(unsigned char)*len+);
outstr[len] = '\0'; //以3个8位字符为一组进行编码
for(i=,j=;i<len-;j+=,i+=)
{
outstr[i] = base64_table[str[j]>>]; //取出第一个字符的前6位并找出对应的结果字符
outstr[i+] = base64_table[(str[j]&0x3)<< | (str[j+]>>)]; //将第一个字符的后位与第二个字符的前4位进行组合并找到对应的结果字符
outstr[i+] = base64_table[(str[j+]&0xf)<< | (str[j+]>>)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符
outstr[i+] = base64_table[str[j+]&0x3f]; //取出第三个字符的后6位并找出结果字符
} switch(str_len % )
{
case :
outstr[i-]='=';
outstr[i-]='=';
break;
case :
outstr[i-]='=';
break;
} return;
} void base64_decode_s(const unsigned char *code, std::string& outstr, long* lpBufLen)
{
//根据base64表,以字符找到对应的十进制数据
int table[]={,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,
};
long len;
long str_len;
//unsigned char *res = NULL;
int i,j; //计算解码后的字符串长度
len = strlen((const char*)code);
//判断编码后的字符串后是否有=
if(strstr((const char*)code,"=="))
str_len=len/*-;
else if(strstr((const char*)code,"="))
str_len=len/*-;
else
str_len=len/*; if (NULL != lpBufLen) {
*lpBufLen = str_len;
} //res = (unsigned char*)malloc(sizeof(unsigned char)*str_len+1);
outstr.resize(sizeof(unsigned char)*len+);
//memset(outstr.,0, str_len+1);
//res[str_len]='\0'; //以4个字符为一位进行解码
for(i=,j=;i < len-;j+=,i+=)
{
outstr[j]=((unsigned char)table[code[i]])<< | (((unsigned char)table[code[i+]])>>); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的后2位进行组合
outstr[j+]=(((unsigned char)table[code[i+]])<<) | (((unsigned char)table[code[i+]])>>); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应bas464表的十进制数的后4位进行组合
outstr[j+]=(((unsigned char)table[code[i+]])<<) | ((unsigned char)table[code[i+]]); //取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
} return;
}
base64编解码的两个函数(安全版本)的更多相关文章
- base64编解码的两个函数
base64编解码的两个函数,声明,参考网络上的代码实现. unsigned char *base64_encode(unsigned char *str, long* lpBufLen) { lon ...
- Delphi Base64 编解码函数
Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...
- Delphi 自带的 Base64 编解码函数
今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- Delphi 自带了 Base64 编解码的单元
Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个单元提供两套四个公开函数: 对流的编解码: procedu ...
- EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug
本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...
- 【VBA研究】如何用Base64 编解码方法实现简单的加解密
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...
- C#字符串Base64编解码
C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...
- Java实现BASE64编解码
Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...
随机推荐
- Math、Date内置对象方法整理
Math : 内置的对象(构造函数)静态属性或静态方法. 一. Math.PI : 圆周率 ...
- nmap 扫描出某网段内web服务器
今天碰到一个问题,客户要求在他们内网中扫描出所有web服务器,然后再对web进行渗透测试,共两个网段. 以前我记得用nmap时曾得到过某地址的web服务器数据,比如显示是IIS或apach,但忘了具体 ...
- Python核心技术与实战——五|条件与循环
我们在前面学习了列表.元组.字典.集合和字符串等一系列Python的基本数据结构类型,下就需要把这一个个基本的数据串在一起了,这就要用到我们今天要讲的东西——”条件与循环“. 一.条件语句 条件语句的 ...
- 刷PTA这一周的感悟
在慕课上报名了浙江大学的<数据结构>这门课,主讲人陈越老师,何钦铭老师,两位老师讲的很好,课后有配套的PTA可以用来做题,练习. 最近在PTA上刷题,发现自己代码实现能力是真的差劲,一开始 ...
- vue2.0 之 过渡动画transtion
过渡的类名: 在进入/离开的过渡中,会有 6 个 class 切换 (v 是前缀,name = v) v-enter:定义进入过渡的开始状态.在元素被插入时生效,在下一个帧移除. v-enter-ac ...
- 自定义指令 限制input 的输入位数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- bzoj5020 & loj2289 [THUWC 2017]在美妙的数学王国中畅游 LCT + 泰勒展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5020 https://loj.ac/problem/2289 题解 这个 appear 和 d ...
- MySQL---时区问题
1.控制台输入select now(); 发现与北京时间相差8小时: 2.解决: 2.1.进入MySQL客户端 mysql -uroot -p 2.2.全局,当前会话时区设置set GLOBAL ...
- [洛谷P2567] SCOI2010 幸运数字
问题描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是&quo ...
- Centos logrotate截断tomcat日志文件
1. 设置logrotate轮转日志文件 tomcat日志目录:/usr/local/tomcat/apache-tomcat-8.5.34/logs /etc/logrotate.d/目录下创建to ...