Base64编码解码原理

一. Base64编码由来

  为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情况下,做一种扩展方案来支持二进制文件的传送。把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种基于64个可打印字符来表示二进制数据的表示方法。

二. Base64编码原理

  看一下Base64的索引表,字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。数值代表字符的索引,这个是标准Base64协议规定的,不能更改。64个字符用6个bit位就可以全部表示,一个字节有8个bit位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个bit,左边两个永远是0。

     Base64编码解码原理 - 梁敬承 - 梁敬承技术笔记

  那么怎么用6个有效bit来表示传统字符的8个bit呢?8和6的最小公倍数是24,也就是说3个传统字节可以由4个Base64字符来表示,保证有效位数是一样的,这样就多了1/3的字节数来弥补Base64只有6个有效bit的不足。你也可以说用两个Base64字符也能表示一个传统字符,但是采用最小公倍数的方案其实是最减少浪费的。结合下边的图比较容易理解。Man是三个字符,一共24个有效bit,只好用4个Base64字符来凑齐24个有效位。红框表示的是对应的Base64,6个有效位转化成相应的索引值再对应Base64字符表,查出"Man"对应的Base64字符是"TWFU"。说到这里有个原则不知道你发现了没有,要转换成Base64的最小单位就是三个字节,对一个字符串来说每次都是三个字节三个字节的转换,对应的是Base64的四个字节。这个搞清楚了其实就差不多了。

      Base64编码解码原理 - 梁敬承 - 梁敬承技术笔记  Base64编码解码原理 - 梁敬承 - 梁敬承技术笔记

  但是转换到最后你发现不够三个字节了怎么办呢?愿望终于实现了,我们可以用两个Base64来表示一个字符或用三个Base64表示两个字符,像下图的A对应的第二个Base64的二进制位只有两个,把后边的四个补0就是了。所以A对应的Base64字符就是QQ。上边已经说过了,原则是Base64字符的最小单位是四个字符一组,那这才两个字符,后边补两个"="吧。其实不用"="也不耽误解码,之所以用"=",可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。由此可见Base64字符串只可能最后出现一个或两个"=",中间是不可能出现"="的。下图中字符"BC"的编码过程也是一样的。

       Base64编码解码原理 - 梁敬承 - 梁敬承技术笔记

三. 总结  

  说起Base64编码可能有些奇怪,因为大多数的编码都是由字符转化成二进制的过程,而从二进制转成字符的过程称为解码。而Base64的概念就恰好反了,由二进制转到字符称为编码,由字符到二进制称为解码。

  Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。

  Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如"上网"对应utf-8格式的Base64编码是"5LiK572R",对应GB2312格式的Base64编码是"yc/N+A=="。


转自:http://www.cnblogs.com/luguo3000/p/3940197.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse mat 打开dump文件,明明大小1G,打开后却只有不到100M.其他的去哪了

eclipse mat 打开dump文件,明明大小1G,打开后却只有不到100M.其他的去哪了 Used heap dump 显示的大小远小于dump文件大小 解决: window-->Preferences-->memory Analuzer-->勾选keep unreachable objects-->apply and close

MVP模式介绍

一、概述MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。二、MVC和MVP的区别作为一种新的模式,MVP与MVC有着一个重大的区别:…

eclipse mat 分析dump文件,打开文件报错,out of memeory

eclipse mat 分析dump文件,打开文件报错,out of memeory 解决: 1.打开eclipse报out of memeory通用 window-->Preferences-->java-->installed JREs-->选中-->edit--> 在default VM arguments栏中加入:-server -Xms4096m -Xmx4096m -XX:PermSize512m -XX:M…

VIPER模式介绍

一、概述VIPER模式的理念不属于MV(X)系类,其理念来自于建筑设计。建筑领域流行这样一句话,“我们虽然在营造建筑,但建筑也会重新塑造我们”。正如所有开发者最终领悟到的,这句话同样适用于构建软件。编写代码中至关重要的是&#…

mysql索引(b+tree)小记

索引:快速检索的数据结构,缺点是插入时要创建索引树,所以索引不能太多 1.hash O(1) 时间复杂度低 有冲突,不支持范围查询,不支持排序 2.二叉树BST 平衡树:O(logn) 缺点:当树不平衡时,相对于没有索引 3.红黑数 相对二叉树,相对平衡 插入逐渐增大时,也会有右倾,也不是很平衡…

强制消除Xcode警告的方法

比如我已经知道某行会报警告了,但是代码有这么写的道理,实在不想看到警告,可以用下面这个宏把这几行代码包住,就可以消除警告了。#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wunused-variable"/…

springMVC 源码级别总结原理,DispatcherServlet核心方法

前言 springMVC自我总结 本次maven: <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.…

SQLite3中的数据类型

一、概述 大多数的数据库引擎&#xff08;到现在据我们所知的除了sqlite的每个sql数据库引擎&#xff09;都使用静态的、刚性的类型&#xff0c;使用静态类型&#xff0c;数据的类型就由它的容器决定&#xff0c;这个容器是这个指被存放的特定列。 Sqlite使用一个更一般的动态类…

一个java工程师必知的安全意识(信息传输篇)

我们在遇到涉及用户密码&#xff0c;用户联系方式&#xff0c;身份证信息等敏感字段的时候&#xff0c;一般的处理方式是&#xff1a; 1.传输使用密文&#xff0c;拒绝明文传输用户密码&#xff0c;推荐明文加盐加密&#xff0c;后台再解密 比如要传输的明文是123456的明文密…

关于iOS7里的JavaScriptCore framework

在iOS7沸沸扬扬的扁平化论战之外&#xff0c;WWDC 2013还是公布了很多让开发者小兴奋的点&#xff0c;其中包括多任务加强支持background fetch和transfer&#xff0c;近场通信的AirDrop和p2p&#xff0c;以及游戏控制器和游戏中心的加强&#xff1b;当然还包括了让web开发同学…

[nginx报错]---unknown directive chunkin in /XXXXX/XXXXXX:XX的几种解决方式

问题&#xff1a; nginx报错:unknown directive “chunkin” in /XXXXX/XXXXXX:XX 解决&#xff1a; 当出现unknown directive&#xff0c;一般有个反应&#xff0c;就是nginx中&#xff0c;要么配置格式不对&#xff0c;要么多了什么东西&#xff0c;要么就是有不支持的语法…

[数据库] ------ mysql 执行计划

mysql 执行计划 简单来说&#xff0c;mysql整体架构分为三块&#xff1a;应用层&#xff0c;逻辑层&#xff0c;物理层 应用层&#xff1a;负责与客户端交互&#xff0c;建立连接&#xff0c;返回数据&#xff0c;响应请求。 逻辑层&#xff1a;负责查询处理&#xff0c;事务管…

[数据库] ------ mysql规范

mysql规范&#xff1a; mysql优化的第一步&#xff0c;就是规范&#xff0c;国有国法&#xff0c;家有家规&#xff0c;一个团队在一起开发&#xff0c;也一定要有一套明确的规范来相互制约&#xff0c;下面这些规范只是作为一个互联网行业的建议&#xff0c;我相信一个团队最…

深入浅出Fetch API

多年来&#xff0c;XMLHttpRequest一直是web开发者的亲密助手。无论是直接的&#xff0c;还是间接的&#xff0c; 当我们谈及Ajax技术的时候&#xff0c;通常意思就是基于XMLHttpRequest的Ajax&#xff0c;它是一种能够有效改进页面通信的技术。 Ajax的兴起是由于Google的Gmail…

[设计模式] ------ 策略模式

策略模式 它定义了算法家族&#xff0c;分别封装起来&#xff0c;让他们直接可以互相替换&#xff0c;此模式让算法的变化&#xff0c;不会影响到使用算法的客户 其实很简单&#xff0c;可能很多人都用到了&#xff0c;只不过还不知道这就是策略模式而已。 比如定义一个接口A…

OC语法简化

很多刚从其他编程语言转到Objective-C的同学看到长长的函数名会感到崩溃&#xff0c;这种语法让消息的传递像一个英语句子&#xff0c;大大增强了可读性。比如你想初始化一个浮点数&#xff0c;需要这么写&#xff1a; NSNumber value [NSNumber numberWithFloat:123.45f];从这…

[设计模式] ------ 简单工厂模式

简单工厂模式 不同类型下创建对应的不同的对象&#xff0c;得到不同的结果&#xff0c;就叫简单生产模式 比如 定义一个接口&#xff0c;叫A&#xff0c;里面有方法a&#xff0c;返回int类型 类B1实现A接口&#xff0c;也实现a方法&#xff0c;里面做的是加法运算 类B2实现…

Podfile语法

一、Podfile Podfile文件详细描述了一个或多个工程中targets的依赖关系。Podfile会默认创建一个隐式的目标链接到工程中用户的第一个target&#xff0c;名称为“default”。 一个Podfile可以非常简单: pod AFNetworking, ~> 1.0 也可以配置的复杂一点,如下: source https:/…

[设计模式] ------ 模板模式

模板模式 模板模式&#xff0c;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构&#xff0c;就可以重定义该算法的某些特定步骤 一般是定义一个抽象类&#xff0c;有抽象方法&#xff0c;有骨架方法&a…

获取本地沙盒文件的MIMEType

通过发送一个基于本地文件的URL请求&#xff0c;从响应对象中获取MIMEType值。代码如下&#xff1a;NSString *path [[NSBundle mainBundle] pathForResource:"测试文件"ofType:"pdf"]; //创建本地文件URL NSURL *url [NSURL fileURLWithPath:path]; //创…