什么是Base64算法
个人博客请访问 http://www.x0100.top
A:为什么在进行Http传输的时候,需要把Byte数组进行Base64编码呢?
B:这很简单呀,因为Http协议是文本协议,不同于二进制协议(如Thrift)那样直接进行二进制传输。
A:那么,直接把Byte数组转换成String不就行了吗?类似newString(bytes)这样。为什么非要用Base64呢?
B:首先,Base64是一种编码算法。为什么叫左Base64呢?因为这种算法只支持64个【可打印字符】。
Value |
Char |
Value |
Char |
Value |
Char |
Value |
Char |
0 |
A |
16 |
Q |
32 |
g |
48 |
w |
1 |
B |
17 |
R |
33 |
h |
49 |
x |
2 |
C |
18 |
S |
34 |
i |
50 |
y |
3 |
D |
19 |
T |
35 |
j |
51 |
z |
4 |
E |
20 |
U |
36 |
k |
52 |
0 |
5 |
F |
21 |
V |
37 |
l |
53 |
1 |
6 |
G |
22 |
W |
38 |
m |
54 |
2 |
7 |
H |
23 |
X |
39 |
n |
55 |
3 |
8 |
I |
24 |
Y |
40 |
o |
56 |
4 |
9 |
J |
25 |
Z |
41 |
p |
57 |
5 |
10 |
K |
26 |
a |
42 |
q |
58 |
6 |
11 |
L |
27 |
b |
43 |
r |
59 |
7 |
12 |
M |
28 |
c |
44 |
s |
60 |
8 |
13 |
N |
29 |
d |
45 |
t |
61 |
9 |
14 |
O |
30 |
e |
46 |
u |
62 |
+ |
15 |
P |
31 |
f |
47 |
v |
63 |
/ |
A:为什么只能支持64个字符呢,多了不是更好吗?可打印字符又是什么意思?
B:这就涉及到ASCII码的知识了。ASCII码的范围是0-127,其中0-31和127这33个字符属于控制字符(Controlcharacters)。剩下32-126这95个字符属于可打印字符(Printable characters),包含数字、大小写字母、常用符号。在这里我只列举其中的一部分:
控制字符:
可打印字符:
B:早起的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ASCII字符。导致原本8Bit的字节码(范围0-255)超过了可用的范围。比如当邮件传输图片资源的时候,某一个Byte值是10111011B,对应十进制187不属于ASCII码范围,因此无法被传输。这个时候,Base64编码应用而生了,它利用6bit字符表达了原本的8bit字符。Base64可以把原本ASCII码的控制字符甚至ASCII码之外的字符都转换成可打印的6big字符。
A:可是原本的字节码8bit,Base64怎么能够用6big来容纳8bit的内容呢?
B:既然单一字符的位数有限,我们可以增加字符的数量。8和6的最小公倍数是24,这就意味着我们可以用4个Base64字符来表示3个传统的8bit字符。
B:像表格中这样,8Bit X 3的字符串可以每6个bit分成一组,每一组bit对应一个十进制的index,每一个index值又对应了Base64的字符。最终,8bit的字符串[Man]编码成了Base64的[TWFu]。相比8bit的字符编码,Base64编码会多占用三分之一的字节长度,以此为代价实现了更好的兼容性。
A:那么如果原本的8Bit字符串长度不是3的倍数,比如长度是13,多余的那一个字符怎么编码呢?
B:很好解决,多余的8bit中,前6bit做为一个Base64字符,剩下的2bit做为第二个Base64字符的前两位,后面的四位补0即可。至于第三第四个Base64字符,没有匹配的8bit字符,则使用[=]字符填充(Padding)。如下图把8bit的[M]编码成Base64的[TQ==]。
A:明白啦。那么一个经过Base64编码的字符串,如何进行解码呢?
B:解码也是同样道理,6bit X 4的字符串可以每8bit分成一组,共3组。每一组转换成一个8位的Byte字节。
A:OK,最后一个问题,Base64是否可以用来对重要信息做加密呢?
B:不行的。Base64只是一种编码算法,而非加密算法。任何人都可以将Base64的编码结果解码成唯一的原文。真正的加密算法有很多,包括MD5,SHA,ASE,RSA等等,有时间的话会一一介绍。
什么是Base64算法相关推荐
- java基础----Base64算法的使用
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...
- Base64算法的编程使用
Base64算法定义 Base64是一种基于64个字符的编码算法,以任意8位字节序列组合的描述形式,这种形式不易直接识别.经Base64编码后的字符串的字符数是以4为单位的整数倍 Base64密钥 B ...
- C++使用AES+Base64算法对文本进行加密
使用AES算法和Base64实现具体的文本加密. 采用AES算法的CBC模式,16位秘钥,PKCS7Padding填充方案对文本进行加解密.此方案可防止一些比较关键的文本暴露,也可以用于服务器通信间的 ...
- java乱码base64_JavaScript BASE64算法实现(完美解决中文乱码)
JavaScript 的 BASE64 算法 var BASE64={ enKey: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123 ...
- 古典密码学原理和Base64算法原理
密码学,就是研究如何将一个内容(可以是字符串.文件.二进制流)通过一系列算法转换成另一种内容的学科.从广义上来看,有一个算法可以将字符串转换成另一个字符串即可,即该算法可逆不可逆都可以:从狭义上来看, ...
- js java base64,JavaScript BASE64算法实现(完美解决中文乱码)
这篇文章主要介绍了JavaScript BASE64算法实现(完美解决中文乱码),先用escape()对中文进行编码.然后再进行base64编码. 解码时,再加入()对中文进行解码,这样就可以避免中文 ...
- 让你彻底理解Base64算法(Base64是什么,Base64解决什么问题,Base64字符串末尾的=是什么)
[版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/118220299 出自:shusheng0 ...
- MongoDB数据库--扩展Base64,算法
Python高级 非关系型数据库(NO-SQL:Not Only SQL) 非关系型数据库的诞生:随着IT的发展,变革,数据量越来越大,数据之间的关系越来越零散,松散,没有太大的关系,利用关系型数据库 ...
- Base64 算法原理,以及编码、解码【加密、解密】 介绍
Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...
最新文章
- 用JavaScript和CSS实现“在页面中水平和垂直居中”的时钟
- 平面设计现在行业发展如何?
- The server time zone value is unrecognized or repr
- 警惕!这7件事情千万不要发生你身上-来自15年程序员的忠告
- Live Messenger 邀请,再次放送
- js对象数组 按对象的某一属性进行去重
- 使用Qt设计师文件的3种方式
- [在今天的历史]他们终于要对我下毒手了
- 论有一个服务器后可以干什么
- 网络工程师Day7--本地AAA配置
- BigDecimal 基本使用 比较大小和加减乘除
- CF 317D Game with Powers
- hikaricp mysql_JAVA连接数据库 #03# HikariCP
- # Okhttp解析—Interceptor详解
- 一年增加1.2w星,它能否引领中间件的未来?
- MGV2000_S905L系列_线刷_通刷固件
- Python pgm解析和格式转换
- Poco库使用:操作Json格式数据
- 神武3进不去 服务器响应,windows7系统玩神武2卡机的解决方法
- mahout实现协同过滤推荐算法
热门文章
- HTML5+CSS期末大作业:明星主页网站设计—— 鹿晗明星(7页)带留言带音乐表格 HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
- java用JBarcode组件生成条形码(支持自定义字体及颜色)
- Myeclipse10安装以及破解方法
- 一套适用于各行业的在线教育系统
- 《R语言实战》:广义线性模型R实现
- ArcGIS地图制作的注记、格网添加
- 强叔侃墙_NAT_nopat示例
- Apache poi文件读取
- 搞IT的应届生如何写好简历?
- Java登录页面实时验证用户名密码和动态验证码