为什么人们不使用base128?

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

问题是,ASCII字符集中至less有32个字符是接收terminal可以解释的“控制字符”。 例如,有BEL(钟)字符,使接收terminal钟声。 有SOT(传输开始)和EOT(结束传输)字符执行正是他们的名字暗示。 不要忘记字符CR和LF,这些字符在数据结构被串行/拼合成stream时可能有特殊的含义。

Adobe创build了Base85编码,以在ASCII字符集中使用更多字符,但AFAIK受专利保护。

因为这128个字符中有一些是不可打印的(主要是那些在0x20以下的字符)。 因此,他们不能可靠地作为一个string在电线上传输。 而且,如果你走到128码以上,由于跨系统使用不同的编码,你可能会遇到编码问题。

正如其他答案中已经指出的,关键是要将字符集缩小到可打印的字符集。 更高效的编码scheme是basE91,因为它使用较大的字符集,并且仍然避免在低ASCII范围内的控制/空白字符。 该网页包含了一个很好的比较二进制与base64与basE91编码效率。

我曾经清理过Java的实现。 如果人们有兴趣,我可以把它推到GitHub上。

更新 :现在在GitHub上 。

前32个字符是控制字符是完全没有关联的,因为你不必使用它们来获得128个字符。 我们有256个字符可供select,只有前32个是控制字符。 这留下192个字符,因此128完全可能不使用控制字符。

原因如下:它必须是一样的东西,无论在哪里,都可以复制和粘贴。 因此,它必须是在任何论坛,聊天,电子邮件等上显示相同的字符。 这意味着我们不能使用字符,即论坛/聊天/电子邮件客户端可能通常用于格式化或忽略。 不pipe字体,语言和区域设置如何,它也必须是相同的字符。

这就是原因!

Base64是常见的,因为它解决了各种问题(几乎可以在任何你能想到的地方工作)

  • 您不必担心运输是否8位清洁 。

  • 编码中的所有字符都是可打印的。 你可以看到他们。 您可以复制并粘贴它们。 您可以在URL中使用它们(特定变体)。 等等

  • 固定的编码大小。 您知道m个字节总是可以编码为n个字节。

  • 每个人都听说过 – 它得到了广泛的支持,许多图书馆,很容易与之互操作。

Base128没有所有这些优点。

它看起来像8位清洁 – 但回想一下base64使用65个符号。 如果没有带外字符,则不能获得固定编码大小的好处。 如果使用带外字符,则不能再进行8位清理。

这不是所有的负面,但。

  • base128比base64更容易编码/解码 – 你只是使用class次和口罩。 对于embedded式实现可能很重要

  • 通过使用更多的可用位,base128比base64更有效地使用传输。

人们使用base128 – 我现在正在使用它。 这只是不常见的。

不确定,但我认为较低的值(表示控制代码或某些东西)不能可靠地作为HTTP请求/响应中的文本/字符传送,127以上的值可能是locale / codepage /任何特定的,所以没有所有浏览器/平台都可以使用128个不同的字符。

esaji是对的。 Base64是用来编码二进制数据传输使用一个只有文本的协议。 在Wiki条目中是正确的。

签出base128 PHP级。 使用ISO 8859-1字符集进行编码和解码。

GoogleCode PHP-Class Base128