Base64简介

原文链接:
https://blog.csdn.net/fengbingchun/article/details/85016088?ops_request_misc=&request_id=&biz_id=102&utm_term=base64&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-85016088.pc_search_result_control_group&spm=1018.2226.3001.4187

1 介绍

Base64是基于64个可打印字符来显示2进制数据,它用于传输8Bit字节代码,并在HTTP传输中广泛应用。

1.1 规则
把3个字符变成4个字符(加两位高位0,数据一次递后)。
每76个字符加一个换行符。
最后的结束符也要处理(加等于号)。

由于二进制的一些字符在网络协议中属于控制字符,不能直接传送,因此需要用Base64编码之后传输,编码之后传输的是一些很普通的ASCII字符。
Base64常用于邮件编码,当邮件中有二进制数据时,就要编码转换。
图片的编码
Url中有二进制数据,这个时候需要Base64编码(Web安全的Base64)
可以进行简单的加密,Base64的编解码规则是透明的,因此用Base64加密时要加盐。

1.1 何为Base64算法

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

1.2 Base64算法是如何设计的

在不同的实现中,Base64算法中由64个字符组成的字符集是不一样的。但是通常的实现方法是选择64个通用且能打印的字符来组成这样一个集合。且要保证这个集合中的每个字符组成的数据在数据传输系统中不会被修改。

早期的Base64算法是用来实现运行相同操作系统之间进行拨号操作而创建的。

1.3 Bas64算法的实现

接下来,我们将使用ASCII文本来作为例子讲解,但是这并不是Base64最主流的用法。Base64算法生成的字符串可以安全地在任何实现了Base64算法的计算机之间传输。Base64典型的用途是给二进制数据(例如:图片文件)进行编码的,我们为了简化,就不用二进制,而是使用一段ASCII文本字符串来作为例子进行讲解。Base64编码出来的数据只会包含最多64种不同的ASCII字符,因此,使用Base64算法,我们就能避免数据在部分系统传输过程中发生改变。

例如,下面是一段ASCII文本组成的名言,我们将用这段名言来作为需要编码的输入样例:

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中可打印字符包括字母A~ Z、a~ z、数字0~9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展,指的是一系列的电子邮件技术规范):在MIME格式的电子邮件中,Base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定Base64。使用的字符包括大小写英文字符各26个、数字10个、加号+和斜杠/,共64个字符,等号=用来作为后缀用途。

使用Base64编码后的数据比原始数据略长,为原来的4/3.在电子邮件中,根据RFC822规定,每76个字符,还需要加上一个回车换行。可以估算编码后的数据长度大约为原长的135.1%。转换的时候,将3字节的数据,先后放入一个24位的缓冲区中,先来的字节占高位。数据不足3字节的话,缓冲区中剩下的比特用0补足。每次取出6比特(因为2^6=64),按照其值选择ABCDEFGHIJKLMNOPQSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出,直到全部输入数据转换完成。若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=。

UTF-7:是一个修改版Base64(Modified Base64)。主要是将UTF-16的数据,用Base64的方法编码为可打印的ASCII字符序列。目的是传输Unicode数据。主要的区别在于不用等号=补余,因为该字符通常需要大量的转译。

IRCu:在IRCu等软件所使用的P10 IRC服务器间协议中,对客户与服务器的消息类型号(client/server numerics)和二进制IP地址采用了Base64编码。消息类型号的长度固定为3字节,顾可直接编码为4个字节而不需要填充。对IP地址进行编码时,则需要在地址前添加一些0比特,使之可以编码为整数个字节。这里所用的符号集与MIME的也有所不同,将+/该成了[]。

在URL中的应用:Base64编码是从二进制到字符的过程可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其它应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/和+分别改成了-和_,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将+和/改成了!和-,因为+,*以及在IRCu中用到的[和]在正则表达式中都可能具有特殊含义。此外还有一些变种,它们将+/改为_-或.(用作编程语言中的标识符名称)或.(用于XML中的Nmtoken)甚至_:(用于XML中的Name)。

Base64编码过程:(1). 将原数据每三个字节作为一组,一共是24个二进制位;(2). 将这24个二进制位分为四组,每个组有6个二进制;(3). 在每组前面加两个00扩展成32个二进制位,即四个字节;(4). 根据下图中的Base64索引表,得到扩展后的每个字节对应的符号:

在这里插入图片描述
网上关于Base64的开源软件很多,如 cppcodec ,还有对各种Base64开源软件性能的分析,如 https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c ,还有一些Base64在线编解码网站如 http://base64.xpcha.com/

以上整理的内容主要来自维基百科。

原文链接:https://blog.csdn.net/qq_19782019/article/details/88117150

1.4 数据填充

Base64编码要求把3个8位字节(#add字母用ascii表示)(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’。

这样,长度为3个字节的数据经过Base64编码后就变为4个字节。

BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。

这是一种可逆的编码方式。

编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/

共64个字符:26 + 26 + 10 + 1 + 1 = 64。

【注:其实是65个字符,“=”是填充字符】。

64个字符需要6位来表示,表示成数值为0~63。

2 示例

例1:
字符串“Xue”经过Base64编码后变为“WHVl”。

在这里插入图片描述
长度为3个字节的数据位数是83=24,可以精确地分成64。

如果数据的字节数不是3的倍数,则其位数就不是6的倍数,那么需要就不能精确地划分成6位的块。,

此时,需在原数据后面添加1个或2个零值字节,使其字节数是3的倍数。

然后,在编码后的字符串后面添加1个或2个等号“=”,表示所添加的零值字节数。

例2:

字符串“Xu”经过Base64编码后变为“WHU=”。
在这里插入图片描述
字符串“X”经过Base64编码后变为“WA==”。
在这里插入图片描述
应用:

需要明文保存二进制数据时,可以将不可打印的二进制数据经过Base64编码转成可打印的字符串。

Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
Base64也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
在LDIF档案,Base64用作编码字串。

原文链接:https://blog.csdn.net/weiwangchao_/article/details/70217345

https://blog.csdn.net/weiwangchao_/article/details/70217345?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值