1

我最近发现base32, base64 and base128 are the most efficient forms of base-n encoding,虽然base58,ascii85,base91,base92等人提供了一些效率改善优于无处不在的base64,由于他们使用更多的字符,有一些映射损失;例如,基数92中每个字符对恰好有272个指数,不可能映射到2的基数为10的幂,因此完全被浪费掉了。 (Base91编码只有89个字符的相似损失(如以上链接中的脚本所示),但是it's patented。)对于JavaScript字符串等场景,base128编码的可行性如何?

如果在现代真实世界的场景中使用base128是可行的,那将会很棒。

有0×21(33)的0x7E(126)中提供92个字符SANS\",它使一个很好的开始创造与可能的字符最多JSONifiable字符串。

以下是我设想可以找到其余字符的几种方法。这是我问的问题。

  • 只是默默地使用Unicode

    两字节Unicode字符可以用来填补剩余的36个所需的指数。非常不理想;如果这比线路上的base64差,我不会感到惊讶。仅对于推文长度等Unicode字符计数场景才有用。不完全是我要去的。
     

  • 选择从上(> 128)ASCII范围

    的JavaScript内36非Unicode字符被以期望的字符编码配置将偶尔严重错误建造。所以语言(和网页浏览器)处理打印任意和不可打印的二进制数据就好了。那么为什么不使用上面的ASCII范围呢?它在那里被使用,对吧?

    一个非常现实的问题可能是数据通过HTTP进行传输,并通过一个或多个 开罐器 代理服务器在我的浏览器和服务器之间传输。这有多严重?我知道HTTP上的WebSockets几年前造成了一些真正的痛苦,甚至可能在今天。
     

  • 使用UTF-8以有趣的方式

    UTF-8定义的1至4个字节的长序列来封装Unicode代码点的种类。字节2到4始终始于10xxxxxx。该范围内有64个字符。如果我通过一个na代理服务器,它可以逐个字符地过滤Unicode范围之外的字符,在这个范围内使用字节可能意味着我的数据将毫发无损!
     

  • 确定36个魔法字节,将各种深奥的原因

    也许有一些会成功穿越互联网基础设施的> 99%,由于各种历史和实施过程中的原因,某些高ASCII字符的工作。这些可能是什么字符?

 

Base64是无处不在的,并已清盘正在使用无处不在,这是很容易理解为什么:它是在1987年定义为使用一个精心挑选的,非常有限的AZ的字母, az,0-9,+和/对于大多数环境(例如使用非ASCII编码的大型机)来说(并且仍然)很困难。

EBCDIC大型机和MIME电子邮件仍然非常有,但今天的base64也结束了作为频繁使用的管道内的JavaScript来处理的情况下,“东西在这个数据路径威力呛二进制”它增加的集体开销并不重要。

目前只有one other question on SO regarding the general viability of base128 encoding,从字面上看,每一个答案都有一个或多个问题。接受的答案表明base128必须使用ASCII的前128个字符,并且唯一的答案是确认编码字母可以使用任何字符,然后继续声称base128未被使用,因为编码字符必须易于重新输入(这是base58针对FWIW进行了优化)。所有其他人都有各种各样的问题(如果需要,我可以进一步解释)。

这个问题试图重新提出上面的一些额外的明确主题澄清,希望能够确定具体的去/不去。

回答

0

从技术上来说这是可行的,但是从能够实现更好的结果的角度来看,它不是可行的:使用HTTP gzip压缩。在实践中,如果启用压缩,则字符串的霍夫曼编码将从base64编码中减去1/3的大小,因为base64字符串中的每个字符只有6位熵。

作为一项测试,我尝试使用像Dummy File Creator这样的实用程序生成一个1Mb的随机数据文件。然后base64 encoded it并使用7zip对结果文件进行gzip压缩。

  • 原始数据:1,048,576字节
  • Base64编码数据:1398104个字节
  • Gzip压缩的base64编码数据:1060329个字节

这只是在大小增加了1.12%(和编码的开销 - >压缩 - >解压缩 - >解码)。

Base128编码需要1,198,373个字节,所以如果您想要可比较的文件大小,您也必须对其进行压缩。 Gzip压缩是所有现代浏览器的标准功能,那么base128的情况会如何,以及所需的额外复杂程度如何?

相关问题