Base64编码解码
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
可用于网络传输二进制数据(图片,文件...),将二进制转为Base64编码后,可以写入XML,将XML传输到Server端,再进行Base64解码,得到二进制数据。(二进制不能直接写入XML,Base64字符才可以。)
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”。
例子1
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
索引
|
对应字符
|
0
|
A
|
17
|
R
|
34
|
i
|
51
|
z
|
1
|
B
|
18
|
S
|
35
|
j
|
52
|
0
|
2
|
C
|
19
|
T
|
36
|
k
|
53
|
1
|
3
|
D
|
20
|
U
|
37
|
l
|
54
|
2
|
4
|
E
|
21
|
V
|
38
|
m
|
55
|
3
|
5
|
F
|
22
|
W
|
39
|
n
|
56
|
4
|
6
|
G
|
23
|
X
|
40
|
o
|
57
|
5
|
7
|
H
|
24
|
Y
|
41
|
p
|
58
|
6
|
8
|
I
|
25
|
Z
|
42
|
q
|
59
|
7
|
9
|
J
|
26
|
a
|
43
|
r
|
60
|
8
|
10
|
K
|
27
|
b
|
44
|
s
|
61
|
9
|
11
|
L
|
28
|
c
|
45
|
t
|
62
|
+
|
12
|
M
|
29
|
d
|
46
|
u
|
63
|
/
|
13
|
N
|
30
|
e
|
47
|
v
|
||
14
|
O
|
31
|
f
|
48
|
w
|
||
15
|
P
|
32
|
g
|
49
|
x
|
||
16
|
Q
|
33
|
h
|
50
|
y
|
例子2
//用更接近于编程的思维来说,编码的过程是这样的:
//第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
//然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位,两者相或(|),或者相加,即获得第二个目标字符。
//再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位,两者相或(|),或者相加,即获得第三个目标字符。
//最后将第三个字符与0x3f(00111111)进行与(&)操作,即获得第四个目标字符。//在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。
C++代码实现
特别注意,按位左移和右移,必须是 unsigned char 。可以定义 typedef unsigned char BYTE;
const char* Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxwz0123456789+/"; std::string Base64encode(const unsigned char* buf, unsigned int size) {std::string sBase64;unsigned int i;for (i = 0; i < size/3*3; i += 3){sBase64 += Base64[buf[i] >> 2];sBase64 += Base64[(buf[i]<<4 | buf[i+1]>>4) & 0x3f];sBase64 += Base64[(buf[i+1]<<2 | buf[i+2]>>6) & 0x3f];sBase64 += Base64[buf[i+2] & 0x3f];}if (size % 3 == 1){sBase64 += Base64[buf[i] >> 2];sBase64 += Base64[buf[i]<<4 & 0x3f];sBase64 += '=';sBase64 += '=';}else if (size % 3 == 2){sBase64 += Base64[buf[i] >> 2];sBase64 += Base64[(buf[i]<<4 | buf[i+1]>>4) & 0x3f];sBase64 += Base64[buf[i+1]<<2 & 0x3f];sBase64 += '=';}return sBase64; } std::string Base64decode(std::string sBase64) {std::string sRet;unsigned int nLen = sBase64.size();//nLen一定是4的倍数unsigned char* a = new unsigned char[nLen];int count = 0; // the number of '='.for (unsigned i = 0; i < nLen; ++i){if (sBase64[i] >= 'A' && sBase64[i] <= 'Z')a[i] = sBase64[i] - 'A';else if (sBase64[i] >= 'a' && sBase64[i] <= 'z')a[i] = sBase64[i] - 'a' + 26;else if (sBase64[i] >= '0' && sBase64[i] <= '9')a[i] = sBase64[i] - '0' + 52;else if ('+' == sBase64[i])a[i] = 62;else if ('/' == sBase64[i])a[i] = 63;else if ('=' == sBase64[i]){a[i] = 0;count++;}}sRet.resize(nLen/4*3);unsigned j = 0;for (unsigned i = 0; i < nLen; i += 4){sRet[j++] = a[i]<<2 | a[i+1]>>4;sRet[j++] = a[i+1]<<4 | a[i+2]>>2;sRet[j++] = a[i+2]<<6 | a[i+3];}delete[] a;assert(j == nLen / 4 * 3);if (count)sRet.resize(sRet.size() - count);return sRet; }int main() {//std::string s("i\xb7\x1d\xfb\xef\xffi");//-> abcd++//aQ==//std::string s("\x00\x3f\xbf\xd7m",5);//-> AD+/120=std::string s("abcde"); // -> YWJjZGU=std::string r = Base64encode((const unsigned char*)s.c_str(), s.size());std::string sRet = Base64decode(r);return 0; }
方法2:
std::string Base64encode(const unsigned char* buf, unsigned int size) {//方法二typedef unsigned char BYTE;std::string sBase64;std::basic_string<BYTE> s(buf, buf+size);unsigned count = 0;//不足3的倍数,补 \0 的个数,即编码后“=”个数。if (size % 3 == 1){s.push_back('\0');s.push_back('\0');count = 2;}else if (size % 3 == 2){s.push_back('\0');count = 1;}sBase64.resize((size+count)/3*4);//sBase64的大小一定是4的倍数。unsigned j = 0;for (unsigned i = 0; i < s.size(); i += 3){sBase64[j++] = Base64[s[i] >> 2];sBase64[j++] = Base64[(s[i]<<4 | s[i+1]>>4) & 0x3f];sBase64[j++] = Base64[(s[i+1]<<2 | s[i+2]>>6) & 0x3f];sBase64[j++] = Base64[s[i+2] & 0x3f];}while (count--)//此时 j = (size+count)/3*4sBase64[--j] = '=';return sBase64; }
转载于:https://www.cnblogs.com/htj10/p/11508381.html
Base64编码解码相关推荐
- js base64 编码解码
js base64 编码解码 encode decode,可以直接使用 function Base64() {// private property_keyStr = "ABCDEFGHIJ ...
- python使用base64编码解码数据
python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...
- java svgbase64转byte_java 图片进行base64 编码解码
java 图片进行base64 编码解码 刘振兴 代码分享 2017年06月07日 10555 2条评论 import sun.misc.BASE64Decoder; import sun.misc. ...
- openssl算法 —— 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
openssl 加密字符串的方法: 一.利用openssl命令进行BASE64编码解码(base64 encode/decode): 1. BASE64编码命令 对字符串'abc'进行base64编码 ...
- Java工程中引用Base64编码解码小记
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一. Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两 ...
- Java Base64 编码解码方案总结
转载自 Java Base64 编码解码方案总结 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便.在实际应 ...
- 一些Base64编码/解码及数据压缩/解压方面的知识
一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeD ...
- Javascript中Base64编码解码的使用实例
Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数. 1 var encodedStr = win ...
- 原来浏览器原生支持JS Base64编码解码
原来浏览器原生支持JS Base64编码解码 转载来源:https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-btoa-encode- ...
- python实现base64解码_Python实现base64编码解码
Python实现base64编码解码 通过编程了解base64编码解码过程 (纯属无聊之举,且不支持汉字) a = input("输入(1.base64加密/2.base64解密):&quo ...
最新文章
- 五分钟体验分布式事务框架Seata
- C# 实现基于ffmpeg加虹软的人脸识别
- 没有c语言基础可以学python吗-必须要有C语言基础才能学python吗
- amd支持嵌入式linux,AMD 发布针对 Linux 的 Radeon Software 19.30,支持Radeon RX 5700
- TinyMCE 5 正式版发布,重磅更新!!!
- 《幽灵行者》:近期最酷炫的赛博朋克游戏之一
- lua_string_pattern
- 前端开发中那些不招人“待见”的功能
- java的整数扩展,浮点数扩展,字符扩展,转义字符,布尔值扩展
- Opencv--Mat图像基本操作
- spring整合hibernate事务编程中错误分析
- 第4章 旋转的圆弧(《Python趣味创意编程》教学视频)
- 先验概率、后验概率与似然估计
- 测试linux内核工具,多种测试linux内核的方法
- 蕊动矿机linux cpu超频,蚂蚁l3矿机超频方法!最佳超频参数! | 呆毛网
- armbian 斐讯n1_斐讯N1刷Armbian Linux做服务器
- STM32F103驱动无刷直流电机应用思路
- 【微信小程序】-- 页面导航 -- 编程式导航(二十三)
- 简单枚举(ZJM要抵御宇宙射线)
- 面试官:说说MySQL中IN和OR的查询效率和区别
热门文章
- 前排!零基础小白学习3D建模的必经之路
- java北大青鸟试题_10个常见2020春招Java面试题及注意事项!
- 【TensorFlow】TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
- 大数据分析实战-信用卡欺诈检测
- 数据结构(十一)桶排序
- 计算机主板知识,小白必看电脑主板知识扫盲,主板是什么?有什么用?
- 多层陶瓷电容器用处_陶瓷电容器的用途有哪几种?
- android tcp socket框架_花了一个星期,我终于把RPC框架整明白了
- hive连接mysql报错_hive远程模式初始化mysql报错
- Datax-web 使用Python3 执行脚本