对于像JavaScript字符串这样的场景,base128编码有多可行?

问题描述 投票:4回答:3

我最近发现base32, base64 and base128 are the most efficient forms of base-n encoding,而base58,Ascii85,base91,base92等确实比普遍存在的base64提供了一些效率提升,因为它们使用了更多的字符,有一些映射损失;例如,在base92中每个字符对碰巧有272个索引,这些索引不可能从2的基数10幂映射到,因此完全被浪费了。 (Base91编码只有89个字符的类似丢失(由上面链接中的脚本找到)但是it's patented。)

如果在现代真实场景中使用base128是可行的,那就太好了。

在0x21(33)到0x7E(126)sans \"中有92个字符可用,这为创建具有最多字符的JSONifiable字符串提供了良好的开端。

以下是我设想的其他角色可以找到的几种方法。这是我问的问题。

  • 只是愚蠢地使用Unicode 可以使用双字节Unicode字符来填充剩余的36个必需索引。非常不理想;如果这比电线上的base64差,我不会感到惊讶。仅对推文长度等Unicode字符计数方案有用。不完全是我想要的。
  • 从上部(> 128)ASCII范围内选择36个非Unicode字符 构建JavaScript时期望字符编码配置偶尔会出现严重错误。因此语言(和Web浏览器)处理打印任意和不可打印的二进制数据就好了。那么为什么不使用上面的ASCII范围呢?它在那里使用,对吗? 一个非常现实的问题可能是数据通过HTTP传输并通过一个或多个 开罐器 我的浏览器和服务器之间的代理。这有多糟糕?我知道HTTP上的WebSockets几年前引起了一些真正的痛苦,甚至可能在今天。
  • 有点使用UTF-8 UTF-8定义了1到4个字节的长序列来封装Unicode代码点。字节2到4总是以10xxxxxx开头。该范围内有64个字符。如果我通过一个天真的代理来逐个字符地过滤Unicode范围之外的字符,那么使用此范围内的字节可能意味着我的数据将毫发无损地通过!
  • 确定36个神奇的字节,这些字节可以用于各种深奥的原因 也许有一些高ASCII字符会因各种历史或实现原因成功遍历> 99%的互联网基础设施。这些人物可能是什么角色?

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进行了优化。所有其他问题都有各种问题(如果需要,我可以进一步解释)。

这个问题试图通过一些额外的明确主题澄清来重新提出上述问题,希望能够确定具体的进/出。

javascript encoding utf-8 character-encoding bit-manipulation
3个回答
1
投票

它在技术上可行的意义上是可行的,但是在能够比更简单的替代方案更好地实现结果的意义上它是不可行的:使用HTTP gzip压缩。实际上,如果启用压缩,字符串的霍夫曼编码将使base64编码的大小增加1/3,因为base64字符串中的每个字符只有6位熵。

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

  • 原始数据:1,048,576字节
  • Base64编码数据:1,398,104字节
  • Gzipped base64编码数据:1,060,329字节

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

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


1
投票

从上部(> 128)ASCII范围内选择36个非Unicode字符

base128无效,因为您必须使用大于'128'的字符。对于charater女巫代码> = 128 chrome发送两个字节...(所以在发送时字符串女巫1MB的这个字符将变为2MB字节...所以你放弃了所有的利润)。对于base64字符串,这种现象不会出现(所以我们只松开了~33%)。更多细节here in "update" section


1
投票

base64被大量使用的问题是因为他们使用英文字母和数字来编码二进制流。从技术上讲,我们可以使用更高的基数,但问题是它们需要适合一些字符集。

UTF-8是广泛使用的字符集之一,如果您使用XML或JSON传输数据,您可以很好地使用如下的Base256编码

https://github.com/bharatmicrosystems/base256

© www.soinside.com 2019 - 2024. All rights reserved.