为什么人们不使用base128?

gil*_*mad 90 language-agnostic binary encoding

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

pep*_*uan 105

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

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

  • Base91似乎是一个很好的开源选项:http://base91.sourceforge.net/ (7认同)
  • Re*Base85和Adobe*:如果引用专利号和年份,答案可能会更有用.如果专利是一个问题,那么始终存在[`btoa`](https://en.wikipedia.org/wiki/Ascii85#btoa_version),其可以追溯到1990年,不受专利的限制,无论如何这些都肯定会过期. (5认同)
  • 值得考虑的是,2的幂更容易适应字节数据,并且编码更简单。然后就是可移植性;每种语言都有base64编码和/或base64解码。 (2认同)

dri*_*iis 65

因为这128个字符中的一些是不可打印的(主要是那些低于代码点0x20的字符).因此,它们不能可靠地通过电线传输.而且,如果你超过代码点128,由于跨系统使用不同的编码,你可能会遇到编码问题.

  • Base94存在于github中,它使用所有94个可打印的ASCII字符:https://gist.github.com/iso2022jp/4054241 (8认同)

Ben*_*gel 15

正如其他答案中所述,关键是将字符集减少为可打印字符集.一种更有效的编码方案是basE91,因为它使用更大的字符集,并且仍然避免低ASCII范围内的控制/空白字符.该网页包含二进制与base64与basE91编码效率的良好比较.

我曾经清理过Java实现.如果人们感兴趣我可以在GitHub上推送它.

更新:它现在在GitHub上.

  • 推送到:https://github.com/bwaldvogel/base91 (2认同)

小智 12

前32个字符是控制字符绝对没有相关性,因为你不必使用它们来获得128个字符.我们有256个字符可供选择,只有前32个是控制字符.留下192个字符,因此在不使用控制字符的情况下完全可以使用128个字符.

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

这就是原因!

  • 控制字符是相关的,因为几乎每个人都已经认为它应该尽可能地代码页/编码中性.这必然会限制您只使用(7位)ASCII,这是大多数相关编码的子集.也不是所有的互联网都是8位干净的,其中大部分是事实上的ASCII.你的观点值得一提. (7认同)
  • 只需添加:ASCII仅定义128个字符.字符#128到#255未在ASCII中定义.由于问题明确引用ASCII而不是"任何8位编码",因此所有答案都将自己限制为ASCII集的128个字符. (7认同)

Joh*_*ooy 10

Base64很常见,因为它解决了各种问题(几乎可以在任何地方使用)

  • 您无需担心传输是否为8位清洁.

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

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

  • 每个人都听说过它 - 它得到了广泛的支持,很多库,很容易与之互操作.

Base128没有那么多优点.

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

尽管如此,这并非全都是消极的.

  • base128比base64更容易编码/解码 - 你只需使用移位和掩码.对嵌入式实现很重要

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

人们确实使用base128 - 我现在正在使用它.它并不常见.