维基百科上说

当需要对二进制数据进行编码时,通常使用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

以传输相同数量信息的更多数据为代价,确保接收者能够以预期的方式解码数据,即使接收者对其余字符集有不同的解释。


当前回答

我发现方便的一个例子是尝试在XML中嵌入二进制数据。SAX解析器错误地解释了一些二进制数据,因为这些数据可以是任何东西,包括XML特殊字符。Base64在发送端对数据进行编码,在接收端对其进行解码,解决了这个问题。

其他回答

为文本数据设计的媒体当然最终也是二进制的,但是文本媒体通常使用某些二进制值作为控制字符。此外,文本媒体可能会拒绝某些二进制值作为非文本。

Base64编码将二进制数据编码为只能在文本媒体中解释为文本的值,并且不包含任何特殊字符和/或控制字符,因此数据也可以在文本媒体中保存。

大多数计算机以8位二进制格式存储数据,但这不是必需的。一些机器和传输介质一次只能处理7位(甚至更少)。这样的介质将以7位的倍数来解释流,因此如果您要发送8位的数据,您将不会在另一端收到您所期望的内容。Base-64只是解决这个问题的一种方法:将输入编码为6位格式,通过媒体发送,然后在接收端解码回8位格式。

用XML编码二进制数据

假设您想在XML文档中嵌入一对图像。图像是二进制数据,而XML文档是文本。但是XML不能处理嵌入的二进制数据。那么该怎么做呢?

一种选择是用base64编码图像,将二进制数据转换为XML可以处理的文本。

而不是:

<images>
  <image name="Sally">{binary gibberish that breaks XML parsers}</image>
  <image name="Bobby">{binary gibberish that breaks XML parsers}</image>
</images>

你该怎么做:

<images>
  <image name="Sally" encoding="base64">j23894uaiAJSD3234kljasjkSD...</image>
  <image name="Bobby" encoding="base64">Ja3k23JKasil3452AsdfjlksKsasKD...</image>
</images>

XML解析器将能够正确地解析XML文档并提取图像数据。

为什么不看看当前定义Base64的RFC呢?

Base encoding of data is used in many situations to store or transfer data in environments that, perhaps for legacy reasons, are restricted to US-ASCII [1] data.Base encoding can also be used in new applications that do not have legacy restrictions, simply because it makes it possible to manipulate objects with text editors. In the past, different applications have had different requirements and thus sometimes implemented base encodings in slightly different ways. Today, protocol specifications sometimes use base encodings in general, and "base64" in particular, without a precise description or reference. Multipurpose Internet Mail Extensions (MIME) [4] is often used as a reference for base64 without considering the consequences for line-wrapping or non-alphabet characters. The purpose of this specification is to establish common alphabet and encoding considerations. This will hopefully reduce ambiguity in other documents, leading to better interoperability.

Base64最初被设计为一种允许二进制数据附加到电子邮件的方式,作为多用途互联网邮件扩展的一部分。

而不是转义特殊字符

我将给您一个非常不同但真实的例子:我编写javascript代码以在浏览器中运行。HTML标记有ID值,但是在ID中哪些字符有效是有限制的。

但是我希望我的ID无损地引用文件系统中的文件。现实中的文件中可以有各种各样奇怪而奇妙的字符,从感叹号、重音字符、波浪号,甚至是表情符号!我不能这样做:

<div id="/path/to/my_strangely_named_file!@().jpg">
    <img src="http://myserver.com/path/to/my_strangely_named_file!@().jpg">
    Here's a pic I took in Moscow.
</div>

假设我想运行这样的代码:

# ERROR
document.getElementById("/path/to/my_strangely_named_file!@().jpg");

我认为这段代码在执行时会失败。

使用Base64,我可以引用一些复杂的东西,而不用担心哪种语言允许哪些特殊字符以及哪些需要转义:

document.getElementById("18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA");

与使用MD5或其他哈希函数不同,您可以反向编码以找出真正有用的数据。

我希望我64年前就知道Base64。如果使用' encodeURIComponent '和str.replace(' \n ', ' \\n '),我就不会把我的头发扯掉了。

SSH传输文本:

如果你试图通过ssh传递复杂的数据(例如,一个dotfile,这样你就可以得到你的shell个性化),在没有base64的情况下,祝你好运。这是你用64进制来做的(我知道你可以使用SCP,但这需要多个命令-这使得ssh到服务器的键绑定复杂化):

https://superuser.com/a/1376076/114723