为什么人们不使用base128?

时间:2011-05-15 11:18:25

标签: encoding language-agnostic binary

为什么每个人都使用base 64在网上传输二进制数据?我问这是因为ASCII字符集有128个字符,理论上可以代表128 ......

8 个答案:

答案 0 :(得分:101)

问题是ASCII字符集的至少32个字符是“控制字符”,可以由接收终端解释。例如,有BEL(钟)字符使接收终端发出声响。 SOT(传输开始)和EOT(传输结束)字符完全符合他们的名字所暗示的字符。并且不要忘记字符CR和LF,可能在数据结构如何序列化/展平为流中具有特殊含义。

Adob​​e创建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)

esaji是对的。 Base64用于编码二进制数据,以便使用仅需要文本的协议进行传输。它位于Wiki条目中。

答案 7 :(得分:2)

签出base128 PHP-Class。使用ISO 8859-1 charset进行编码和解码。

GoogleCode PHP-Class Base128