为什么每个人都使用base 64在网上传输二进制数据?我问这是因为ASCII字符集有128个字符,理论上可以代表128 ......
答案 0 :(得分:101)
问题是ASCII字符集的至少32个字符是“控制字符”,可以由接收终端解释。例如,有BEL(钟)字符使接收终端发出声响。 SOT(传输开始)和EOT(传输结束)字符完全符合他们的名字所暗示的字符。并且不要忘记字符CR和LF,可能在数据结构如何序列化/展平为流中具有特殊含义。
Adobe创建the Base85 encoding以使用ASCII字符集中的更多字符,但AFAIK受专利保护。
答案 1 :(得分:64)
因为128个字符中的一些是不可打印的(主要是那些低于代码点0x20的字符)。因此,它们不能可靠地通过电线传输。而且,如果你超过代码点128,你可能会遇到编码问题,因为系统使用的编码不同。
答案 2 :(得分:15)
正如其他答案中所述,关键点是将字符集减少为可打印字符集。 更有效的编码方案是basE91,因为它使用更大的字符集,并且仍然避免低ASCII范围内的控制/空白字符。该网页包含二进制与base64与basE91编码效率的良好比较。
我曾经清理过Java实现。如果有兴趣的话,我可以把它推到GitHub上。
更新:现在是on GitHub。
答案 3 :(得分:14)
前32个字符是控制字符绝对没有相关性,因为你不必使用它们来获得128个字符。我们有256个字符可供选择,只有前32个是控制字符。留下192个字符,因此在不使用控制字符的情况下完全可以使用128个字符。
原因如下:它必须是看起来相同的东西,并且无论在何处都可以复制和粘贴。因此,它必须是在任何论坛,聊天,电子邮件等上显示相同的字符。这意味着我们不能使用论坛/聊天/电子邮件客户端通常用于格式化或忽略的字符。无论字体,语言和区域设置如何,它也必须是相同的字符。
这就是原因!
答案 4 :(得分:9)
Base64很常见,因为它解决了各种问题(几乎可以在任何地方使用)
您无需担心传输是否为8-bit clean。
编码中的所有字符均可打印。您可以查看他们。您可以复制并粘贴它们。您可以在URL(特定变体)中使用它们。等
修正了编码大小。您知道m
个字节始终可以编码为n
个字节。
每个人都听说过它 - 它受到广泛支持,有很多库,很容易与之互操作。
Base128没有那么多优点。
它看起来像8位清洁 - 但回想一下base64使用65个符号。如果没有带外字符,您将无法获得固定编码大小的好处。如果使用带外字符,则不能再进行8位清理。
但并非全部都是消极的。
base128比base64更容易编码/解码 - 你只需使用移位和掩码。对于嵌入式实现非常重要
通过使用更多可用位,base128比base64更有效地使用传输。
人们做使用base128 - 我现在正在使用它。它并不常见。
答案 5 :(得分:4)
不确定,但我认为较低的值(代表控制代码或其他内容)不能在HTTP请求/响应中作为文本/字符可靠地传输,而127以上的值可能是locale / codepage / what-specific,所以没有128个不同的字符可以在所有浏览器/平台上工作。
答案 6 :(得分:3)
答案 7 :(得分:2)
签出base128 PHP-Class。使用ISO 8859-1 charset进行编码和解码。