base64编解码的另外几个版本
#include "crypto/encode/base64.h" static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"; static inline bool is_base64(unsigned char c)
{
return (isalnum(c) || (c == '+') || (c == '/'));
} std::string Base64::Encode(const std::string& src)
{
std::string ret;
unsigned char char_array_3[];
unsigned char char_array_4[]; size_t srcLen = src.length();
const char* pSrc = src.c_str(); size_t i = ;
while (srcLen--) {
char_array_3[i++] = *(pSrc++);
if (i == ) {
char_array_4[] = (char_array_3[] & 0xfc) >> ;
char_array_4[] = ((char_array_3[] & 0x03) << ) + ((char_array_3[] & 0xf0) >> );
char_array_4[] = ((char_array_3[] & 0x0f) << ) + ((char_array_3[] & 0xc0) >> );
char_array_4[] = char_array_3[] & 0x3f; for (i = ; (i <); i++)
ret += base64_chars[char_array_4[i]];
i = ;
}
} size_t j = ;
if (i)
{
for (j = i; j < ; j++)
char_array_3[j] = '\0'; char_array_4[] = (char_array_3[] & 0xfc) >> ;
char_array_4[] = ((char_array_3[] & 0x03) << ) + ((char_array_3[] & 0xf0) >> );
char_array_4[] = ((char_array_3[] & 0x0f) << ) + ((char_array_3[] & 0xc0) >> );
char_array_4[] = char_array_3[] & 0x3f; for (j = ; (j < i + ); j++)
ret += base64_chars[char_array_4[j]]; while ((i++ < ))
ret += '='; } return ret;
} std::string Base64::Encode(const unsigned char* src, size_t dataLen)
{
if ((src == NULL) || (dataLen == ))
{
return std::string();
} std::string ret;
unsigned char char_array_3[];
unsigned char char_array_4[]; size_t srcLen = dataLen;
const char* pSrc = reinterpret_cast<const char*>(src); size_t i = ;
while (srcLen--) {
char_array_3[i++] = *(pSrc++);
if (i == ) {
char_array_4[] = (char_array_3[] & 0xfc) >> ;
char_array_4[] = ((char_array_3[] & 0x03) << ) + ((char_array_3[] & 0xf0) >> );
char_array_4[] = ((char_array_3[] & 0x0f) << ) + ((char_array_3[] & 0xc0) >> );
char_array_4[] = char_array_3[] & 0x3f; for (i = ; (i <); i++)
ret += base64_chars[char_array_4[i]];
i = ;
}
} size_t j = ;
if (i)
{
for (j = i; j < ; j++)
char_array_3[j] = '\0'; char_array_4[] = (char_array_3[] & 0xfc) >> ;
char_array_4[] = ((char_array_3[] & 0x03) << ) + ((char_array_3[] & 0xf0) >> );
char_array_4[] = ((char_array_3[] & 0x0f) << ) + ((char_array_3[] & 0xc0) >> );
char_array_4[] = char_array_3[] & 0x3f; for (j = ; (j < i + ); j++)
ret += base64_chars[char_array_4[j]]; while ((i++ < ))
ret += '=';
} return ret;
} bool Base64::Decode(const std::string& src, std::string& out)
{
out.clear(); size_t in_len = src.size();
size_t i = ;
size_t j = ;
size_t in_ = ;
unsigned char char_array_4[], char_array_3[]; while (in_len-- && (src[in_] != '=') && is_base64(src[in_])) {
char_array_4[i++] = src[in_]; in_++;
if (i == ) {
for (i = ; i <; i++)
char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (i = ; (i < ); i++)
out += char_array_3[i];
i = ;
}
} if (i) {
for (j = i; j <; j++)
char_array_4[j] = ; for (j = ; j <; j++)
char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (j = ; (j < i - ); j++)
out += char_array_3[j];
} return true;
} bool Base64::Decode(const unsigned char* src, size_t srcLen, unsigned char* decoded, size_t& decoded_length)
{
if ((src == NULL) || (srcLen < ))
return false;
if ((decoded == NULL) || (decoded_length < ))
return false; size_t i = ;
size_t j = ;
size_t in_ = ;
unsigned char char_array_4[];
unsigned char char_array_3[]; size_t offset = ;
while (srcLen-- && (src[in_] != '=') && is_base64(src[in_])) {
char_array_4[i++] = src[in_]; in_++;
if (i == ) {
for (i = ; i <; i++)
char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (i = ; i < ; i++)
{
if (offset < decoded_length)
decoded[offset++] = char_array_3[i];
else
return false;
}
i = ;
}
} if (i) {
for (j = i; j <; j++)
char_array_4[j] = ; for (j = ; j <; j++)
char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (j = ; (j < i - ); j++)
{
if (offset < decoded_length)
decoded[offset++] = char_array_3[j];
else
return false;
}
} decoded_length = offset; return true;
} bool Base64::Decode(const unsigned char* src, size_t srcLen, std::vector<unsigned char>& out)
{
out.clear(); size_t i = ;
size_t j = ;
size_t in_ = ;
unsigned char char_array_4[];
unsigned char char_array_3[]; while (srcLen-- && (src[in_] != '=') && is_base64(src[in_])) {
char_array_4[i++] = src[in_]; in_++;
if (i == ) {
for (i = ; i <; i++)
char_array_4[i] = (unsigned char)base64_chars.find(char_array_4[i]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (i = ; (i < ); i++)
out.push_back(char_array_3[i]);
i = ;
}
} if (i) {
for (j = i; j <; j++)
char_array_4[j] = ; for (j = ; j <; j++)
char_array_4[j] = (unsigned char)base64_chars.find(char_array_4[j]); char_array_3[] = (char_array_4[] << ) + ((char_array_4[] & 0x30) >> );
char_array_3[] = ((char_array_4[] & 0xf) << ) + ((char_array_4[] & 0x3c) >> );
char_array_3[] = ((char_array_4[] & 0x3) << ) + char_array_4[]; for (j = ; (j < i - ); j++)
out.push_back(char_array_3[j]);
} return true;
}
base64编解码的另外几个版本的更多相关文章
- python rsa 加密解密 (编解码,base64编解码)
最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...
- Delphi Base64 编解码函数
Delphi 自带 Base64 编解码的单元, EncdDecd这个单元提供两套四个公开函数: 对流的编解码:procedure EncodeStream(Input, Output: TStrea ...
- ios Base64编解码工具类及使用
为了避免明码传递http内容,可以用base64编码后传输,收到方再解码,也方便了2进制数据的字符串式传输. 对于ios来说,google给提供了一个很好的工具类,方便进行base64编解码,当然也可 ...
- Java实现BASE64编解码
Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...
- Delphi 自带的 Base64 编解码函数
今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...
- openssl命令行Base64编解码
openssl对base64编解码的规范支持较差,用它编解码的结果别的语言如php处理很不方便,注意的几点整理如下 1,如果php加密结果做base64编码长度小于64,则需要添加一个换行符opens ...
- python base64 编解码,转换成Opencv,PIL.Image图片格式
二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...
- EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug
本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...
- C++,Base64编解码字符串或文件
参考链接:在C语言中使用libb64进行Base64编解码 GitHub地址:https://github.com/BuYishi/cpp_base64_demo base64_demo.cpp #i ...
随机推荐
- JS解析URL参数为对象
曲不离口,拳不离手 JS小编程练习之一:解析URL参数为对象 url:http://www.baidu.com/we/index.html?id=098&aaa=123&ccc=456 ...
- 43. Multiply Strings (JAVA)
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- IPv6地址格式示例及IPv6与IPv4的区别分析
认识IPv6地址 IPv4地址是类似 A.B.C.D 的格式,它是32位,用\".\"分成四段,用10进制表示: 而IPv6地址类似X:X:X:X:X:X:X:X的格式,它是128 ...
- Django【第14篇】:Django之Form组件补充
补充 一.定义的规则 class TeacherForm(Form): #必须继承Form # 创建字段,本质上是正则表达式 username = fields.CharField( required ...
- Vue刷新token,判断token是否过期
1.判断token是否过期,前端请求后,后台会返回一个状态给你.根据状态判断是否过期,刷新token 2.是否每次请求后端都会返回新的token给你.或者后端给你定义了一个刷新token的方法,那此时 ...
- JOI2019 有趣的家庭菜园3
问题描述 家庭菜园专家 JOI 先生在他的家庭菜园中种植了一种叫 Joy 草的植物.在他的菜园里,有 N 个花盆自东向西摆放,编号分别为 \(1, \ldots, N\).每个花盆中有一株 Joy 草 ...
- 部署至Oracle数据库的注意事项
部署至Oracle数据库的注意事项 安装数据库之前1)检查计算机名,如果是乱码,改一下名字 2)有杀毒软件,能关则关 但是最好征求用户的同意 3)装两个一起解压databa ...
- 51nod1820 长城之旅
题目描述 BB 痛失一血(打了场Comet OJ回来就没了) 不过后来又刷了一道水题 题解 LCM+取模=结论题 结论1 \(gcd(k^{2^i}+1,k^{2^j}+1)=1 (i\neq j 且 ...
- linux运维、架构之路-全网备份项目方案
一.项目需求说明 某公司有多台服务器,里面的数据很重要,如果磁盘坏了,数据就会丢失,所以公司要求把重要服务器数据备份以便出现问题时可以进行恢复,要求:每天晚上00点整在所有服务器上打包备份系统配置文件 ...
- java伪代码读后感
愚公,在这位名家身上,浓缩了项目的组织者,团队经理,编程人员,技术分析师等众多角色的优秀素质.原始需求的产生“惩山北之塞,出入之迁”项目沟通的基本方式“聚室而谋之”项目的目标“毕力平险,指通豫南,达于 ...