让你完全理解base64是怎么回事
HTTP将BASE64-编码用于基本认证和摘要认证,在几种HTTP扩展中也使用了该编码。
Base-64编码保证了二进制数据的安全
Base-64编码可以将任意一组字节转换为较长的常见文本字符序列,从而可以合法地作为首部字段值。Base-64编码将用户输入或二进制数据,打包成一种安全格式,将其作为HTTP首部字段的值发送出去,而无须担心其中包含会破坏HTTP分析程序的冒号、换行符或二进制值。
Base-64编码是作为MIME多媒体电子邮件标准的一部分开发的,这样MIME就可以在不同的合法电子邮件网关之间传输富文本和任意的二进制数据里。Base-64编码与将二进制数据文本化表示的uuencode和BinHex标准在本质上类似,但空间效率更高。
8位到16位
Base-64编码将一个8位子节序列拆散为6位的片段,并为每个6位的片短分配一个字符,这个字符是Base-64字母表中的64个字符之一。这64个输出字符都是很常见的,可以安全地放在HTTP首部字段中。这64个字符中包括大小写字母、数字、+和/,还是用里特殊字符=
。
注意:由于base64编码用了8位字符来表示信息中的6个位,所以base64编码字符串大约比原始值扩大了33%。
此处输入图片的描述
下面是一个简单的base64编码实例。在这里,三个字符组成的输入值“Ow!”是base64编码的,得到的是4个字符的base64编码值“T3ch”。它是按以下方式工作的。
(1) 字符串"Ow!"被拆分成3个8位的字节(0x4F、0x77、0x21)。
(2) 这3个字节构成了一个24为的二进制01001111 01110111 00100001。
(3) 这些为被划分为一些6位的序列010011、110111、011100、1000001.
(4) 每个6位值都表示了从0~63之间的数字,对应base64字母表中的64个字符之一。得到的base64编码字符串是4个字符的字符串“T3ch”。然后就可以通过线路将这个字符串作为“安全的”8位字符传送出去,因为只用了一些移植性最好的字符(字母、数字等)。
// 现在将字符串"Ow!"转换为base64编码值
var str = 'Ow!';
// 或去字符串的二进制码
var binary = [];
for (var i = 0; i < str.length; i++) {// 转换为二进制表示var binStr = str.charCodeAt(i).toString(2);// 将得到的二进制放入数组中得到// ['1001111','1110111','100001']// 因为一个正常的二进制字节都是由8bit组成的,不够8bit的话不表示.上面得到的都不够8bit所以前面我们手动给补0,就得到了// ['01001111','01110111','00100001']binary.push(binStr);
}// 1 把字符串按照6位分开,进行分割,得到['010011','110111','011100','1000001']
// 2 将每一个转换为十进制分别对于[19,55,28,33];
// 3 将每一位数字分别对于上面提供的base64对应表,得到对应的编码,分别对于 T 3 c h
// 4 最后就会得到base64编码T3ch
console.log('字符"Ow!"最后得到的base64编码为"T3ch"');
base64填充
base64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数)。
对已填充的二进制进行编码时,任何完全填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"="表示。如果6位组是部分填充的,就将填充位设置为0.
下面会写一个填充实例。初始输入字符串为"a:a"为3个字节(24位)。24是6和8的倍数,因此按照上面给出的例子计算。无需填充就会得到base64编码为"YTph"。
然而,再增加一个字符,输入字符串变为"a:aa",转换为二进制就会有32位长。而6和8的下一个公倍数为48.因此要添加16为的填充码。填充的前4位是与数据位混合在一起的。得到的6位组01xxxx,会被当作010000、十进制中的16,或者base64编码的Q
来处理。剩下的两个6位组都是填充码,用=
来表示。
a:a -- 011000 010011 101001 100001 -- YTph
a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==
a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=
a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh
最新的浏览器提供了自动生成base64的方法atob
和btob
btoa('a:a')
// => "YTph"
atob('YTph')
// => "a:a"
希望此文可以帮助你完全理解BASE-64。
让你完全理解base64是怎么回事相关推荐
- 前端理解base64
一.背景:ascii码 字符=>二进制 计算机中所有数据的存储都是以二进制模式,比如想要存储abcd需将其转化为二进制,具体用哪些二进制来表示哪个符号*,有一个统一的编码规则,这就是ascii. ...
- 深入理解 Base64 底层原理
Base64 是一种常见数据编码方式,常用于数据传输.对于移动开发者来讲,网络请求中会经常使用到.对 JSON 熟悉的同学都知道,JSON 的序列化工具都不支持将 byte 数组直接放入 JSON 数 ...
- 简述 · 如何理解base64编码
base64,就是将字节序列编写为可打印的ascii字符,关键就集中在"可打印"三个字上. 计算机中数据存储使用二进制来表示,为了便于阅读,就需要指明哪些二进制数据代表哪个符号,于 ...
- 轻轻松松理解Base64
前言 在开发中,Base64编码会经常使用到,平时也就是使用,没有去真正了解过Base64的原理,今天开发的时候,使用key.value的方式保存Base64编码之后的字符串,文件中的形式为key=v ...
- 让你彻底理解Base64算法(Base64是什么,Base64解决什么问题,Base64字符串末尾的=是什么)
[版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/118220299 出自:shusheng0 ...
- 深入理解Base64字符串编码知识
在我们进行前端开发时,针对项目优化,常会提到一条:针对较小图片,合理使用Base64字符串替换内嵌,可以减少页面http请求. 并且还会特别强调下,必须是小图片,大小不要超过多少KB,等等. 那么,B ...
- OSCAR开源大会 | 「开源学」:如何分门别类理解开源
| 转载自:云计算开源产业联盟 | 作者:庄表伟 | 编辑:胡佳 | 设计:周颖 | 责编:钱英宇 引言 我们拥抱开源需要知识的导引,那么开源究竟是什么?有没有一个明确的指引的点,让任何人都可以去遵照 ...
- 「开源学」:如何分门别类理解开源
来自:OSCAR开源大会,下午场的演讲. 引言 我们拥抱开源需要知识的导引,那么开源究竟是什么?有没有一个明确的指引的点,让任何人都可以去遵照执行,是现代人的困惑. 在 OSCAR 2021 的大会上 ...
- 为什么人工智能还远不能取代人类?语言理解能力仍然欠缺
近几年内人工智能领域取得了一些重要的突破,这背后很重要的因素之一就是一项名为"深度学习"的技术 在前不久举行的一场被广泛认为是人工智能领域里程碑事件的人机对弈比赛中,人工智能取得了 ...
最新文章
- 局域网DVD yum源的制作
- Java中元组的使用
- ORACLE SQL语句总结2
- photoshop基础教程视频-贺叶铭-传智播客-笔记
- java前言之计算机常识
- mysql数据清洗_mysql数据库如何实现亿级数据快速清理
- Quartz-DateBuilder解读
- com.alibaba.druid.sql.parser.ParserException: ERRO
- 苏州天沃科技股份有限公司
- STM32 使用片外外扩内存调试
- docker logstash_学会这一招,轻松测试 logstash 的配置文件
- 架构师入门知识体系树
- 线程同步(windows平台):信号量
- VTM3.0代码阅读:CU、PU、TU
- 张家界和桂林的旅游纪实(避坑指南)
- android 记事本上功能,安卓手机上有多功能记事本app吗?
- 轮椅上的AI博士矣晓沅:9年求学路,我从清华毕业了!
- 【shell】shell创建虚拟环境virtualenv(-bash: virtualenv: command not found)
- DM error code 达梦数据库-错误代码 汇总
- 闲鱼如何保障交易链路质量