我经常听到人们谈论“64进制编码”。它的用途是什么?
当前回答
在计算机的早期,当电话线系统间的通信不是特别可靠时,一种快速而肮脏的验证数据完整性的方法被使用:“位奇偶校验”。在这种方法中,传输的每个字节都有7位数据,第8位将是1或0,以强制字节中1位的总数为偶数。
因此,0x01将作为0x81传输;0x02将是0x82;0x03仍然是0x03等等。
为了进一步完善这个系统,当定义ASCII字符集时,只有00-7F被分配字符。(直到今天,所有设置在80-FF范围内的字符都是非标准的)
当时的许多路由器都把奇偶校验和字节转换放在硬件中,迫使连接到它们的计算机严格处理7位数据。这迫使电子邮件附件(以及所有其他数据,这就是为什么HTTP和SMTP协议是基于文本的)转换为纯文本格式。
这些路由器很少能活到90年代。我非常怀疑它们中任何一个现在还在使用。
其他回答
Base-64编码是一种获取二进制数据并将其转换为文本的方法,这样就更容易在电子邮件和HTML表单数据中传输。
http://en.wikipedia.org/wiki/Base64
当我们通过web服务传输大型二进制对象(图像)时,我在实际意义上使用它。因此,当我使用python脚本测试c# web服务时,可以使用一点魔法重新创建二进制对象。
(在python中)
import base64
imageAsBytes = base64.b64decode( dataFromWS )
一个十六进制数字是一个啃位(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出现了。
二进制数据的问题是它包含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或简单字符集的上下文中对二进制数据进行编码。
推荐文章
- 可能增加的最坏的空间使用量是多少?
- 为什么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吗?