Encoding 为什么不使用base128?

Encoding 为什么不使用base128?,encoding,language-agnostic,binary,Encoding,Language Agnostic,Binary,为什么只有base64而不是base128用于在web上传输二进制数据?ASCII字符集有128个字符,理论上可以表示基数128,但在大多数情况下仅使用base64而不是base128。不确定,但我认为较低的值(表示控制代码或其他内容)在HTTP请求/响应中不能可靠地作为文本/字符传输,127以上的值可能是locale/codepage/任何特定的值,因此没有128个不同的字符可以在所有浏览器/平台上使用。因为这128个字符中有一些无法打印(主要是代码点0x20以下的字符)。因此,它们不能可靠地

为什么只有base64而不是base128用于在web上传输二进制数据?ASCII字符集有128个字符,理论上可以表示基数128,但在大多数情况下仅使用base64而不是base128。

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

因为这128个字符中有一些无法打印(主要是代码点0x20以下的字符)。因此,它们不能可靠地通过导线作为字符串传输。而且,如果您超过了代码点128,可能会出现编码问题,因为不同系统使用不同的编码。

esaji是正确的。Base64用于编码二进制数据,以便使用只需要文本的协议进行传输。它就在条目中。

问题是ASCII字符集中至少有32个字符是“控制字符”,接收终端可能会对其进行解释。例如,有一个BEL(bell)字符使接收终端发出蜂鸣音。有SOT(传输开始)和EOT(传输结束)字符,它们完全按照它们的名称执行。不要忘记字符CR和LF,它们在数据结构如何序列化/展平到流中可能具有特殊意义


Adobe创建ASCII字符集是为了使用更多字符,但它受到专利保护。

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

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


更新:现在是。

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


前32个字符是控制字符与此完全无关,因为您不必使用它们来获取128个字符。我们有256个字符可供选择,只有前32个是控制字符。剩下192个字符,因此128个字符完全可以不使用控制字符

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


这就是原因

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

  • 你不必担心运输是否正常

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

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

  • 每个人都听说过它——它得到了广泛的支持,有很多库,因此易于互操作

Base128没有所有这些优势

看起来它是8位干净的,但是回想一下base64使用了65个符号。如果没有带外字符,就无法获得固定编码大小的好处。如果使用带外字符,则无法再保持8位干净

但也不全是负面的

  • base128比base64更容易编码/解码-您只需使用移位和掩码。对于嵌入式实现来说可能很重要

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


人们确实使用base128——我现在用它做点什么。这并不常见。

为什么不使用base 256?我想关键是要有可打印字符(虽然也有64个以上…),我想base 128不久前就属于我们了。分配到警卫基地64的团队仍然坚持到底。为什么这个问题是针对javascript的?这也适用于网络上使用的大多数其他语言,不是吗?@KenRockot:我看到你认识到你的一些15位字符会被编码成3个字节。您的base-2048编码意味着将11位压缩成2个字节,这使得每个字节5.5位-比base-64少半位。我对java版本感兴趣。将其推到:我希望它使用utf-8来代替…base编码与基础数据无关。您可以使用任何您想要编码文本/数据的文本编码。他的意思是,基本##索引表使用ISO 8859-1 ASCII字符集作为翻译。当您尝试在文本中嵌入基本编码的二进制数据时,它确实与基础数据有关。如果该文本以另一种编码方式编码,则会出现问题。不存在“ISO 8859-1 ASCII”字符集。该程序使用128个不同的可打印ISO 8859-1字符对数据进行编码。它不以任何方式使用ASCII、shape或form.Base91似乎是一个很好的开源选项:值得考虑的是,2的幂更容易适应字节数据,编码也更简单。然后是可移植性;每种语言都有base64编码和/或base64解码。Re Base85和Adobe:如果引用专利号和授予年份,答案可能会更有用。如果专利是一个问题,那么从1990年开始,总是有一个问题没有专利的阻碍,而这些问题是可以证明的