我经常听到人们谈论“64进制编码”。它的用途是什么?
当前回答
几年前,当邮件功能被引入时,它完全是基于文本的,随着时间的推移,对图像和媒体(音频、视频等)等附件的需求出现了。当这些附件通过互联网发送时(基本上是以二进制数据的形式),原始形式的二进制数据损坏的概率很高。因此,为了解决这个问题,BASE64出现了。
二进制数据的问题是它包含null字符,在一些语言中,如C, c++表示字符串的结束,因此以包含null字节的原始形式发送二进制数据将阻止文件被完全读取并导致损坏的数据。
例如:
在C和c++中,这个“null”字符表示字符串的结束。所以"HELLO"是这样存储的:
H e l l o
72 69 76 76 79 00
00表示“停在这里”。
现在让我们深入研究BASE64编码是如何工作的。
注意:字符串的长度应该是3的倍数。
例1:
要编码的字符串:" ace ",长度=3
将每个字符转换为十进制。
A = 97, c= 99, e= 101
将每个小数改为8位二进制表示。
97= 01100001, 99= 01100011, 101= 01100101
合并:01100001 01100011 01100101
在一组6位中分离。
011000 010110 001101 100101
从二进制到十进制计算
011000= 24, 010110= 22, 001101= 13, 100101= 37
使用base64 chart将十进制字符转换为base64。
24= Y, 22= W, 13= N, 37= l
“ace”=>“YWNl”
例2:
要编码的字符串:" abcd "长度=4,不是3的倍数。因此,要使字符串长度为3的倍数,我们必须添加2位填充使length= 6。填充位用“=”符号表示。
需要注意的是:一个填充位等于两个000,所以两个填充位等于四个0 0000。
所以让我们开始这个过程:-
将每个字符转换为十进制。
A = 97, b= 98, c= 99, d= 100
将每个小数改为8位二进制表示。
97= 01100001, 98= 01100010, 99= 01100011, 100= 01100100
在一组6位中分离。
011000, 010110, 001001, 100011, 011001, 00
所以最后6位是不完整的,所以我们插入两个填充位,等于4个零“0000”。
011000, 010110, 001001, 100011, 011001, 000000 ==
现在,它是相等的。末尾的两个等号表示添加了4个零(有助于解码)。
将二进制计算为十进制。
011000= 24, 010110= 22, 001001= 9, 100011= 35, 011001= 25, 000000=0 ==
使用base64 chart将十进制字符转换为base64。
24= Y, 22= W, 9= j, 35= j, 25= Z, 0= A ==
“abcd”=>“YWJjZA==”
其他回答
它用于将任意二进制数据转换为ASCII文本。
例如,电子邮件附件就是通过这种方式发送的。
它基本上是一种用ASCII文本编码任意二进制数据的方法。每3个字节的数据需要4个字符,最后可能还会有一些填充。
基本上,输入的每6位都用64个字符的字母表进行编码。“标准”字母表使用a-z, a-z, 0-9和+和/,用=作为填充字符。有url安全的变体。
维基百科是一个相当好的信息来源。
一个十六进制数字是一个啃位(4位)。两个小字节构成8位,也称为1字节。
MD5生成128位输出,该输出使用32个十六进制数字序列表示,这些十六进制数字依次为32*4=128位。128位等于16字节(因为1字节等于8位)。
每个Base64字符编码6位(除了最后一个非填充字符可以编码2,4或6位);以及最后的填充字符(如果有的话)。因此,根据Base64编码,128位哈希至少需要⌈128/6⌉= 22个字符,如果有的话再加上pad。
使用base64,我们可以生成所需长度(6、8或10)的编码输出。 如果我们选择8字符长的输出,它只占用8个字节,而128位哈希输出则占用16个字节。
因此,除了安全性之外,还使用base64编码来减少空间消耗。
Base64是一个二进制到文本的编码方案,以ASCII字符串格式表示二进制数据。它被设计用来在网络通道中传输二进制格式的数据。
Base64机制使用64个字符进行编码。这些字符包括:
10个数值:即0,1,2,3,…,9 大写字母:即A,B,C,D,…,Z 小写字母:即a,b,c,d,…,z 2个特殊字符(这些字符取决于操作系统):即+,/
base64如何工作
使用base64算法编码字符串的步骤如下:
计算字符串中的字符数。如果它不是3的倍数,那么用特殊字符(即=)填充它,使它是3的倍数。 使用ASCII表将字符串转换为ASCII二进制格式8位。 转换为二进制格式后,将二进制数据分成6位的块。 将6位二进制数据块转换为十进制数。 根据base64索引表将小数转换为字符串。这个表可以是一个例子,但正如我所说,2个特殊字符可能会有所不同。
现在,我们得到了输入字符串的编码版本。
让我们举个例子:将字符串THS转换为base64编码字符串。
计算字符数:它已经是3的倍数。 转换为ASCII二进制格式8位。我们得到(T)01010100 (H)01001000 (S)01010011 将二进制数据分成6位的块。我们收到010101 000100 100001 010011 将6位二进制数据块转换为十进制数。得到21 4 33 19 根据base64索引表将小数转换为字符串。我们有VEhT
当您有一些想要通过网络传送的二进制数据时,通常不会仅仅以原始格式在网络上传输比特和字节。为什么?因为有些媒体是为文本流而设计的。您永远不会知道——有些协议可能会将二进制数据解释为控制字符(如调制解调器),或者您的二进制数据可能会被搞糟,因为底层协议可能认为您输入了一个特殊的字符组合(如FTP如何转换行结束符)。
为了解决这个问题,人们把二进制数据编码成字符。Base64就是这些编码类型中的一种。
为什么是64年? 因为你通常可以依赖于相同的64个字符出现在许多字符集中,你可以合理地相信你的数据最终会在线路的另一端没有损坏。
推荐文章
- 可能增加的最坏的空间使用量是多少?
- 为什么PHP的json_encode函数转换UTF-8字符串为十六进制实体?
- 我如何确定文件编码在OS X?
- Base64长度计算?
- “\d”在正则表达式中是数字吗?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 尝试将一个非属性列表对象设置为NSUserDefaults
- 如何将base64编码的映像保存到磁盘?
- 如何将Base64字符串转换为位图图像,以显示在一个ImageView?
- 用base64编码图像文件
- 如何在iOS上进行base64编码?
- URL方案/主机/路径中的“+”是否代表空格?
- HTML编码问题-显示“”字符而不是“ ”
- 在HTML中,我可以用✓做一个复选标记;. 有相应的x标记吗?
- 有人知道如何解码和编码Base64中的字符串使用Base64吗?