为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们使用Base64?

为什么我们使用Base64?

冉冉说 2019-11-21 12:46:24
当需要对二进制数据进行编码时,通常需要使用Base64编码方案,该二进制数据需要在旨在处理文本数据的媒体上存储和传输。这是为了确保数据在传输过程中保持完整而无需修改。但是,不是因为我们的机器存储的内存始终以二进制形式存储/传输数据,而是仅以二进制形式存储/传输数据吗?因此,无论您编码位模式010011010110000101101110为ManASCII或如TWFu为Base64,你最终将存储相同的位模式。如果最终编码是用零和一表示的,并且每台机器和媒体都可以处理它们,那么将数据表示为ASCII还是Base64有什么关系呢?“旨在处理文本数据的媒体”是什么意思?他们可以处理二进制=>他们可以处理任何东西。谢谢大家,我想我现在明白了。当我们发送数据时,我们不能确定数据将以我们期望的格式解释。因此,我们发送双方都可以理解的以某种格式(例如Base64)编码的数据。这样,即使发送方和接收方对相同内容的解释不同,但由于它们在编码格式上达成共识,因此不会错误地解释数据。以Mark Byers为例如果我要发送Helloworld!一种方法是像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即使接收器碰巧对其余字符集有不同的解释,这也会以相同信息量传输更多数据为代价,从而确保接收器可以按预期方式解码数据。
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

您的第一个错误是认为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

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


查看完整回答
反对 回复 2019-11-21
?
长风秋雁

TA贡献1757条经验 获得超7个赞

用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文档并提取图像数据。


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 1003 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信