3 回答
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
这里的所有字节都是已知的安全字节,因此,几乎没有任何系统会破坏此消息的机会。我可以发送此消息而不是原始消息,然后让接收者撤消该过程以恢复原始消息。
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文档并提取图像数据。
添加回答
举报