我经常听到人们谈论“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==”
其他回答
这是一种二进制数据的文本编码,其结果文本除了字母、数字和符号“+”、“/”和“=”之外什么都没有。这是一种在专门用于文本数据的媒体上存储/传输二进制数据的方便方法。
但为什么是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倍。
当您有一些想要通过网络传送的二进制数据时,通常不会仅仅以原始格式在网络上传输比特和字节。为什么?因为有些媒体是为文本流而设计的。您永远不会知道——有些协议可能会将二进制数据解释为控制字符(如调制解调器),或者您的二进制数据可能会被搞糟,因为底层协议可能认为您输入了一个特殊的字符组合(如FTP如何转换行结束符)。
为了解决这个问题,人们把二进制数据编码成字符。Base64就是这些编码类型中的一种。
为什么是64年? 因为你通常可以依赖于相同的64个字符出现在许多字符集中,你可以合理地相信你的数据最终会在线路的另一端没有损坏。
从http://en.wikipedia.org/wiki/Base64
The term Base64 refers to a specific MIME content transfer encoding. It is also used as a generic term for any similar encoding scheme that encodes binary data by treating it numerically and translating it into a base 64 representation. The particular choice of base is due to the history of character set encoding: one can choose a set of 64 characters that is both part of the subset common to most encodings, and also printable. This combination leaves the data unlikely to be modified in transit through systems, such as email, which were traditionally not 8-bit clean. Base64 can be used in a variety of contexts: Evolution and Thunderbird use Base64 to obfuscate e-mail passwords[1] Base64 can be used to transmit and store text that might otherwise cause delimiter collision Base64 is often used as a quick but insecure shortcut to obscure secrets without incurring the overhead of cryptographic key management Spammers use Base64 to evade basic anti-spamming tools, which often do not decode Base64 and therefore cannot detect keywords in encoded messages. Base64 is used to encode character strings in LDIF files Base64 is sometimes used to embed binary data in an XML file, using a syntax similar to ...... e.g. Firefox's bookmarks.html. Base64 is also used when communicating with government Fiscal Signature printing devices (usually, over serial or parallel ports) to minimize the delay when transferring receipt characters for signing. Base64 is used to encode binary files such as images within scripts, to avoid depending on external files. Can be used to embed raw image data into a CSS property such as background-image.
对Brad所说的进行一点扩展:许多电子邮件和Usenet的传输机制以及其他移动数据的方式都不是“8位干净”的,这意味着标准ascii字符集之外的字符可能在传输中被破坏——例如,0x0D可能被视为回车符,并被转换为回车符和换行符。64进制将所有二进制字符映射为几个标准ascii字母、数字和标点符号,这样它们就不会被打乱。
除了已经说过的,还有两种没有列出的非常常见的用法是
散列:
哈希是将一个字节块转换为另一个固定大小的字节块的单向函数,例如128bit或256bit (SHA/MD5)。将结果字节转换为Base64可以更容易地显示散列,特别是在比较完整性的校验和时。在Base64中经常看到哈希值,以至于许多人将Base64本身误认为是哈希值。
密码:
由于加密密钥不一定是文本,而是原始字节,因此有时需要将其存储在文件或数据库中,这在Base64中很方便。结果加密字节也是如此。
注意,尽管Base64经常用于密码学中,但它并不是一种安全机制。任何人都可以将Base64字符串转换回其原始字节,因此不应将其用作保护数据的手段,而应将其用作更容易显示或存储原始字节的格式。
证书
PEM格式的x509证书是base64编码的。http://how2ssl.com/articles/working_with_pem_files/
推荐文章
- Base64长度计算?
- “\d”在正则表达式中是数字吗?
- 使用Javascript的atob解码base64不能正确解码utf-8字符串
- 尝试将一个非属性列表对象设置为NSUserDefaults
- 如何将base64编码的映像保存到磁盘?
- 如何将Base64字符串转换为位图图像,以显示在一个ImageView?
- 用base64编码图像文件
- 如何在iOS上进行base64编码?
- URL方案/主机/路径中的“+”是否代表空格?
- HTML编码问题-显示“”字符而不是“ ”
- 在HTML中,我可以用✓做一个复选标记;. 有相应的x标记吗?
- 有人知道如何解码和编码Base64中的字符串使用Base64吗?
- 在UIImage和Base64字符串之间转换
- 如何检查一个字符串是否被Base64编码
- 如何保存一个PNG图像服务器端,从base64数据URI