为什么我们要使用Base64?

439

维基百科 表示:

在需要对二进制数据进行编码以存储和传输到设计用于处理文本数据的介质时,通常会使用Base64编码方案。这是为了确保在传输过程中数据不会被修改,仍旧能够保持完整性。

但是,数据不是一直以二进制形式存储/传输吗?因为我们机器的内存存储的就是二进制形式,只是取决于你如何解释它。所以,无论你将位模式010011010110000101101110编码为ASCII中的Man还是Base64中的TWFu,最终都将存储相同的位模式。

如果最终转换为0和1来编码,并且每个机器和媒体都可以处理它们,那么数据用ASCII或Base64表示有何区别?

“设计用于处理文本数据的介质”是什么意思?它们可以处理二进制=>他们可以处理任何东西。


谢谢大家,我现在明白了。

当我们发送数据时,不能确定数据将以我们预期的格式进行解释。因此,我们发送以某种格式(例如Base64)编码的数据,以便双方都能理解。这样即使发送方和接收方以不同方式解释相同的内容,但因为他们同意使用编码格式,所以数据将不会被错误地解释。

来自Mark Byers的示例

如果我想要发送

Hello
world!

有一种方法是以ASCII方式发送它,如下所示:

72 101 108 108 111 10 119 111 114 108 100 33

但是字节10在另一端可能无法被正确解释为换行符,因此我们使用ASCII的一个子集来进行编码,如下所示:

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

这样做会增加传输的数据量,但能确保接收方能按预期方式解码数据,即使接收方对其余字符集有不同的解释。


9
历史背景:电子邮件服务器过去使用7位ASCII编码。其中许多服务器会将高位设置为0,因此您只能发送7位值。请参见http://en.wikipedia.org/wiki/Email#Content_encoding。 - Harold L
4
@Martin,你在开玩笑吧。Perl很难读懂,但是base64根本就无法阅读。 - Peter Long
值得一提的是,以下最正确的答案是Aiden Bell的。虽然7/8位问题、编码等是有效的,但并不是核心原因:任意数据都不能被误解为协议。转换为base64可以防止这种情况发生。例如,包含附件的电子邮件附件可能会出现问题。 - Nick Westgate
1
@Lazer,你的图片已经丢失。 - Mick
10
@Lazer说:“但是在另一端,第10个字节可能无法被正确解释为换行符。” 为什么?两个参与方已经同意使用ASCII码,他们必须正确地解释它啊! - ProgramCpp
显示剩余3条评论
13个回答

8
“设计用于处理文本数据的媒体”是什么意思?
这些协议被设计来处理文本(通常只有英文文本),而不是二进制数据(如.png和.jpg图像)。
它们可以处理二进制数据,但反之则不然。一个旨在表示文本的协议可能会错误地处理包含以下内容的二进制数据:
- 0x0A和0x0D字节,用于行结尾,在不同平台上有所不同。 - 其他控制字符,如0x00(NULL=C字符串终止符)、0x03(END OF TEXT)、0x04(END OF TRANSMISSION)或0x1A(DOS文件结尾),可能会过早地信号结束数据。 - 超过0x7F的字节(如果该协议是为ASCII设计的)。 - 无效的UTF-8字节序列。
因此,您无法仅通过基于文本的协议发送二进制数据。您受限于表示非空格非控制ASCII字符的字节,其中有94个字符。选择Base 64的原因是它更快地处理2的幂,并且64是最大的适用值。

不过还有一个问题。为什么系统仍然没有就像那么常见的UTF-8一样达成共识的通用编码技术呢?

至少在Web上,他们主要已经达成了共识。大多数网站使用UTF-8

在西方,问题在于有很多旧软件认为1个字节=1个字符,无法使用UTF-8。

在东方,问题在于他们对GB2312和Shift_JIS等编码的依赖。

微软似乎仍然没有摆脱选择错误的UTF编码的事实。如果您想使用Windows API或Microsoft C运行时库,则仅限于UTF-16或区域设置的"ANSI"编码。这使得使用UTF-8很痛苦,因为您必须经常进行转换。


8

为什么和如何使用Base64编码?

Base64是一种二进制到文本的编码方案,具有75%的效率。它被用来安全地发送典型的二进制数据(如图像)到传统的“不支持8位”的渠道上。 在早期的电子邮件网络(直到上世纪90年代),大多数电子邮件消息都是7位US-ASCII字符集中的普通文本。因此,许多早期的通信协议标准都是设计用于在“不支持8位”的通信链路上传输数据。 方案效率是输入比特数与编码输出比特数之间的比率。 十六进制(Base16)也是一种二进制到文本的编码方案,效率为50%。

Base64编码步骤(简化版):

  1. 将二进制数据连续地分成24位(3字节)一组。
  2. 每个24位的数据块分成四个6位的部分。
  3. 每个6位的数据组被转换成它们相应的Base64字符值,即Base64编码将三个八位组转换为四个编码字符。输出字节与输入字节的比率为4:3(33%的额外开销)。
  4. 有趣的是,同样的字符在其所处的三个八位组内的位置不同,则被编码成不同的字符。
  5. 接收者需要反转这个过程以恢复原始消息。

4

"设计用于处理文本数据的媒体"是什么意思?

在ASCII统治世界的时代,处理非ASCII值是一件头痛的事情。人们通过各种方式来传输这些值以避免信息丢失。


3
实际上,早些时候并不是所有地方都使用ASCII编码。许多协议都有单独的文本模式和二进制模式来传输数据,但遗憾的是电子邮件当时没有这样做。文本模式之所以必要,正是因为没有一种单一的文本编码规则世界,不是ASCII;每个计算机网络都有自己喜欢的编码,因此有网关的工作是将交换的文本转换为本地编码,使得日本公司可以向美国商务顾问发送电子邮件而无需出现乱码。显然,当发送二进制数据时,这种转换是不可取的。 - Lie Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接