我经常听到人们谈论“64进制编码”。它的用途是什么?


当前回答

这是一种二进制数据的文本编码,其结果文本除了字母、数字和符号“+”、“/”和“=”之外什么都没有。这是一种在专门用于文本数据的媒体上存储/传输二进制数据的方便方法。

但为什么是Base-64?将二进制数据转换为文本的两种替代方法是:

Decimal:将每个字节的十进制值存储为三个数字:045 112 101 037等,其中每个字节由3个字节表示。数据膨胀了三倍。 十六进制:将字节存储为十六进制对:AC 47 0D 1A等,其中每个字节由2个字节表示。数据膨胀了两倍。

Base-64在4个字符中映射3个字节(8 x 3 = 24位),该字符横跨6位(6 x 4 = 24位)。结果看起来像“TWFuIGlzIGRpc3Rpb…”。因此膨胀仅仅是原来的4/3 = 1.3333333倍。

其他回答

它基本上是一种用ASCII文本编码任意二进制数据的方法。每3个字节的数据需要4个字符,最后可能还会有一些填充。

基本上,输入的每6位都用64个字符的字母表进行编码。“标准”字母表使用a-z, a-z, 0-9和+和/,用=作为填充字符。有url安全的变体。

维基百科是一个相当好的信息来源。

几年前,当邮件功能被引入时,它完全是基于文本的,随着时间的推移,对图像和媒体(音频、视频等)等附件的需求出现了。当这些附件通过互联网发送时(基本上是以二进制数据的形式),原始形式的二进制数据损坏的概率很高。因此,为了解决这个问题,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==”

除了已经说过的,还有两种没有列出的非常常见的用法是

散列:

哈希是将一个字节块转换为另一个固定大小的字节块的单向函数,例如128bit或256bit (SHA/MD5)。将结果字节转换为Base64可以更容易地显示散列,特别是在比较完整性的校验和时。在Base64中经常看到哈希值,以至于许多人将Base64本身误认为是哈希值。

密码:

由于加密密钥不一定是文本,而是原始字节,因此有时需要将其存储在文件或数据库中,这在Base64中很方便。结果加密字节也是如此。

注意,尽管Base64经常用于密码学中,但它并不是一种安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的手段,而应将其用作更容易显示或存储原始字节的格式。

证书

PEM格式的x509证书是base64编码的。http://how2ssl.com/articles/working_with_pem_files/

一个十六进制数字是一个啃位(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编码来减少空间消耗。

它用于将任意二进制数据转换为ASCII文本。

例如,电子邮件附件就是通过这种方式发送的。