原文转自 http://www.yanshiba.com/archives/638

1: 为什么需要base64?

ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间.
其中,[0,31],及127, 33个属于不可打印的控制字符.

在电子邮件传输信息时,有些邮件网关会把[0,31]这些控制字符给悄悄清除.
还有的早期程序,收到[128,255]之间的国际字符时,甚至会发生错误.

如何在不同邮件网关之间安全的传输控制字符,国际字符,甚至二进制文件?
于是作为MIME多媒体电子邮件标准的一部分—base64被开发出来.

1.a 什么是url_safe base64编码?

在上面的base64传统编码中会出现+, /两个会被url直接转义的符号,因此如果希望通过url传输这些编码字符串,我们

需要先做传统base64编码,随后将+和/分别替换为- _两个字符,在接收端则做相反的动作解码

http://www.ietf.org/rfc/rfc4648.txt

  /*** URL base64解码* '-' -> '+'* '_' -> '/'* 字符串长度%4的余数,补'='* @param unknown $string*/function urlsafe_b64decode($string) {$data = str_replace(array('-','_'),array('+','/'),$string);$mod4 = strlen($data) % 4;if ($mod4) {$data .= substr('====', $mod4);}return base64_decode($data);}/*** URL base64编码* '+' -> '-'* '/' -> '_'* '=' -> ''* @param unknown $string*/function urlsafe_b64encode($string) {$data = base64_encode($string);$data = str_replace(array('+','/','='),array('-','_',''),$data);return $data;}

2: 一句话说完base64怎么工作的?

把N字节的内容对应的8*N位, 每6位砍成1段,得到 (8*N)/6 个单元,
每个单元的值,都在[0,63]之间,再把其值对应1个ascii字符,拼接起来,OK!

base64_encode(’PHP’) ==> ‘UEhQ’, 编码过程如下:

3: 如果每6位砍成1段,但不能整除,余下2个位或4位怎么办?

用”0″来补至6位, 并再次转化为”base64字符表”中的某个字符.

然后,再用”=”字符当做6个位,继续填充,直至总位数能被8带整除.

字符串 二进制序列(红字为填充位) 编码结果
PHP 010100 000100 100001 010000 UEhQ
it 011010 010111 0100

00 xxxxxx

aXQ=
bool 011000 100110 111101 101111 011011 00

0000 xxxxxx xxxxxx

Ym9vbA==

4:base64表示图片

通过上面的演示,可以看出,base64也可以编码二进制文件,如邮件中的图片和附件.
编码后,我们可以在网页或邮件的源码里,直接体现此图片,
而不必把图片放在服务器上,引用其链接.

用例:base64(’abc.png’) ==> ‘encoded-result’;
则在网页中, <img src=”data:image/png;base64,encoded-result” />

看到下面这个5角星了吗? 右键看源码,就会发现图片是一串字符串 

5: base64编码后字节的变化

很容易推算出, 编码后,每6个位变成8个位.
因此,编码后字节约比编码前多33%.

6: base64串结尾的”=”可以去掉吗?

从上面的编码规则可以反推出, 在base64解码的过程中, 要清除掉结尾处的等号,
然后再反查”base64索引与字母对照表”,转换成原始的字节序列.

那么,去掉尾部的等号,并没有丢失原始信息,但结构变得不规范.
解码前是否判断完整性,这取决于你的应用程序.

实测PHP中的base64_decode函数,并不检测尾部的等号是否完整.

转载于:https://www.cnblogs.com/kidsitcn/p/6901431.html

base64编码以及url safe base64是怎么工作的?相关推荐

  1. URL Safe base64 与 base64相互转换

    为什么需要base64? ASCII码一共规定了128个字符的编码,这128个符号,范围在[0,127]之间. 其中,[0,31],及127, 33个属于不可打印的控制字符. 在电子邮件传输信息时,有 ...

  2. java url安全的base64编码_URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  3. 编解码:Base64编码在URL中的应用

    项目查询背景:目前项目中,本地文件全部使用UTF-8进行编码,Android网络访问全部采用Base64加密传输,因此考虑Base64和Url编码是否会有冲突,查询的结果是没有冲突,可以直接放在Url ...

  4. Scala解码base64编码的URL提示Last unit does not have enough valid bits

    问题描述 开始使用Base64.getMimeDecoder().decode(base_url).map(_.toChar).mkString去解码,部分数据也提示如题的错误 然后尝试使用Base6 ...

  5. c语言图片base64编码,C语言实现Base64编码

    Base64是一种网络上十分常见的编码算法,主要是对ASCII码进行编码,网络上经常用它来对8Bit字节代码进行编码,编码后的字符是数组table[]="ABCDEFGHIJKLMNOPQR ...

  6. html音频base64编码,录音文件与Base64编码相互转换的方法

    前言 最近有几个朋友一直在问语音文件怎么转base64字符串进行发送上传,base64字符串又如何转成文件,论坛中已经有多篇问题的帖子有介绍,这里只是稍微整理,方便大家可以更加方便的使用,首先看效果: ...

  7. base64编码 vba_vb图片转base64编码

    [实例简介] [实例截图] [核心代码] Option Explicit Private Sub Form_Load() Dim arrData() As Byte Dim objBase64 As ...

  8. golang中base64编码_Go语言教程:Base64编码

    概念简介 Go语言提供内建的 base64 编解码支持. 例程代码 package main // 这个语法引入了 `encoding/base64` 包并使用名称 `b64` // 代替默认的 `b ...

  9. URL编码和Base64编码

    URL编码和Base64编码 前言 一.URL编码 1. URLEncoder和URLDecoder 2. URL编码规则 3. Javascript 原生提供三对 Url编码 的函数 3.1 三对函 ...

最新文章

  1. 2021年春季学期-信号与系统-第六次作业参考答案-第三小题
  2. css 写打印样式问题
  3. 深入探讨SDN拓扑发现机制:新的攻击及实践对策【SDN拓扑】(下)
  4. [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置
  5. Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)
  6. Oracle技术之和外键相关的阻塞和死锁问题总结(一)
  7. linux 下如何给火狐安装flash插件(常用命令cd cp tar 实践)
  8. 求排列组合的两种方式 模板
  9. 2022-2028全球与中国汽车制动系统市场现状及未来发展趋势
  10. 【题解】【循环】幂级数求和
  11. python爬取王者荣耀皮肤高清图
  12. 处理超时订单(超时未付款)的解决方案
  13. 解决GitHub/GitLab官网访问慢的问题
  14. #GD32F307VET6# 等位替代海威华芯HHD1705001
  15. Label 标签使用
  16. requireJS常用用法
  17. 视频转换成gif动图的方法步骤
  18. 仿电池电量充电、上下左右剪切动画
  19. TCP原理,Socket与网络编程入门
  20. 【Akka】Akka容错处理

热门文章

  1. python中的__name__=='__main__'如何简单理解(一)
  2. [BOI2007] Mokia
  3. Django项目:CRM(客户关系管理系统)--12--05PerfectCRM实现King_admin注册功能获取内存01...
  4. VMware中虚拟机与主机不能ping通解决办法
  5. 验证请求的时间有效性和接口数据防盗链
  6. Javascript 面向对象编程
  7. UESTC_秋实大哥与快餐店 2015 UESTC Training for Data StructuresProblem C
  8. 无任何网络提供程序接受指定的网络路径 or No network provider accepted the given network path 的解决方法...
  9. HTML DOM教程 24-HTML DOM Frameset 对象
  10. 操作系统与数据库知识点