一尘不染

为什么我们使用Base64?

algorithm

维基百科

当需要对二进制数据进行编码时,通常需要使用Base64编码方案,该二进制数据需要在旨在处理文本数据的媒体上存储和传输。这是为了确保数据在传输过程中保持不变。

但是,不是因为我们的机器存储的内存中始终以二进制形式存储/传输数据,而是仅以二进制形式存储/传输数据吗?因此,无论您编码位模式010011010110000101101110ManASCII或如TWFu为Base64,你最终将存储相同的位模式。

如果最终编码是用零和一表示的,并且每台机器和媒体都可以处理它们,那么将数据表示为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

即使在接收器碰巧对其余字符集有不同的解释的情况下,这样做也会以相同数量的信息传输更多数据为代价,从而确保接收器可以按预期方式解码数据。


阅读 489

收藏
2020-07-28

共1个答案

一尘不染

您的第一个错误是认为ASCII编码和Base64编码可以互换。他们不是。它们用于不同的目的。

  • 当您以ASCII编码文本时,您将从文本字符串开始并将其转换为字节序列。
  • 在Base64中对数据进行编码时,您将从字节序列开始并将其转换为文本字符串。

要了解为什么首先需要Base64,我们需要一些计算历史。


计算机以二进制形式(0和1)进行通信,但是人们通常希望与更丰富的表单数据(例如文本或图像)进行通信。为了在计算机之间传输此数据,首先必须将其编码为0和1,然后发送,然后再次解码。以文本为例-
有许多不同的方法可以执行此编码。如果我们都可以同意一个编码,那就简单得多了,但不幸的是事实并非如此。

最初,创建了许多不同的编码(例如Baudot码),每个字符使用不同的位数,直到最终ASCII成为每个字符7位的标准。但是,大多数计算机将二进制数据存储在每个字节由8位组成的字节中,因此ASCII不适合传输此类数据。有些系统甚至会擦除最高位。此外,跨系统的行尾编码的差异意味着有时还会修改ASCII字符10和13。

为了解决这些问题,引入了Base64编码。这样,您就可以将ribribry字节编码为已知可以安全发送而不损坏的字节(ASCII字母数字字符和几个符号)。缺点是使用Base64编码消息会增加其长度-每3个字节的数据会编码为4个ASCII字符。

发送文本可靠,你可以 编码,使用您的选择(例如UTF-8),然后的文本编码字节
的Base64编码生成的二进制数据转换为文本字符串,它是安全发送编码为ASCII。接收者将不得不逆转此过程以恢复原始消息。当然,这要求接收者知道使用了哪种编码,并且该信息通常需要单独发送。

从历史上看,它已用于对电子邮件中的二进制数据进行编码,其中电子邮件服务器可能会修改行尾。一个更现代的示例是使用Base64编码将图像数据直接嵌入HTML源代码中。在这里,有必要对数据进行编码,以避免像“ <”和“>”这样的字符被解释为标签。


这是一个工作示例:

我希望发送一条两行的短信:

你好
世界!

如果我以ASCII(或UTF-8)格式发送,则将如下所示:

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

字节10在某些系统中已损坏,因此我们可以将这些字节以64为基数编码为Base64字符串:

SGVsbG8sCndvcmxkIQ ==

使用ASCII编码时,如下所示:

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

这里的所有字节都是已知的安全字节,因此任何系统几乎都不会破坏此消息的机会。我可以发送此消息而不是原始消息,然后让接收者撤消该过程以恢复原始消息。

2020-07-28