Character encoding 什么是最有效的二进制到文本编码?

Character encoding 什么是最有效的二进制到文本编码?,character-encoding,binary-data,Character Encoding,Binary Data,到目前为止,我能找到的最接近的竞争者是yEnc(2%)和ASCII85(25%的开销)。yEnc似乎存在一些问题,主要是因为它使用了8位字符集。这引出了另一个想法:是否存在基于UTF-8字符集的二进制到文本编码?这实际上取决于二进制数据的性质以及“文本”对输出的限制 首先,如果二进制数据未压缩,请在编码之前尝试压缩。然后我们可以假设1/0或单个字节的分布或多或少是随机的 现在:你为什么需要文本?通常,这是因为通信通道并不是平等地通过所有字符。e、 g.您可能需要纯ASCII文本,其可打印字符范围

到目前为止,我能找到的最接近的竞争者是yEnc(2%)和ASCII85(25%的开销)。yEnc似乎存在一些问题,主要是因为它使用了8位字符集。这引出了另一个想法:是否存在基于UTF-8字符集的二进制到文本编码?

这实际上取决于二进制数据的性质以及“文本”对输出的限制

首先,如果二进制数据未压缩,请在编码之前尝试压缩。然后我们可以假设1/0或单个字节的分布或多或少是随机的

现在:你为什么需要文本?通常,这是因为通信通道并不是平等地通过所有字符。e、 g.您可能需要纯ASCII文本,其可打印字符范围为0x20-0x7E。你有95个角色可以玩。理论上,每个字符可以编码log2(95)~=6.57位/字符。很容易定义一个非常接近的变换

但是:如果需要分隔符怎么办?现在您只有94个字符,等等。因此,编码的选择实际上取决于您的需求

举一个非常愚蠢的例子:如果您的通道无问题地通过了所有256个字符,并且您不需要任何分隔符,那么您可以编写一个简单的转换,以实现100%的效率。:-)如何做到这一点留给读者作为练习

UTF-8对于任意编码的二进制数据不是一个好的传输。它能够传输值0x01-0x7F,开销仅为14%。我不确定0x00是否合法;可能不会。但在UTF-8中,0x80以上的任何内容都会扩展到多个字节。我将UTF-8视为传递0x01-0x7F或126个唯一字符的受约束通道。如果您不需要delimeters,那么每个字符可以传输6.98位

这个问题的一般解决方案是:假设一个由N个字符组成的字母表,其二进制编码为0到N-1。(如果编码不是假定的,则使用查找表在我们的中间0..N-1表示和您实际发送和接收的内容之间进行转换。)

假设字母表中有95个字符。现在:这些符号中的一些表示6位,一些表示7位。如果我们有一个6位符号和一个7位符号,那么:

A+B=95(符号总数) 2A+B=128(可生成的7位前缀的总数。您可以从2个前缀开始,使用6位符号,也可以从一个前缀开始使用7位符号。)

求解这个系统,你会得到:A=33,B=62。现在,您可以构建符号表: 原始编码 000000 0000000 000001 0000001 ... 100000 0100000 1000010 0100001 1000011 0100010 ... 1111110 1011101 1111111 1011110

要编码,首先将输入的6位移位。如果这六位大于或等于100001,则移动另一位。然后查找相应的7位输出代码,将其转换为适合输出空间并发送。您将在每次迭代中移动6或7位输入

要解码,请接受一个字节并转换为原始输出代码。如果原始代码小于0100001,则将相应的6位移到输出上。否则,将相应的7位移到输出上。每次迭代将生成6-7位的输出


对于均匀分布的数据,我认为这是最佳的。如果您知道源代码中的0多于1,那么您可能希望将7位代码映射到空格的开头,以便更有可能使用7位代码。

听起来您已经找到了答案,Mark。UTF-8作为二进制编码是没有用的,因为任何大于一个字节的UTF-8字符都有超过25%的开销,甚至用于存储文本(每个字节2位或更多位)。编码已经比这更好了。

根据

为压缩的8位二进制输入生成最短的纯ASCII输出


在上列出的内容旁边是Bommanews:

开发B-News(或bommanews)是为了减轻UUEncode和Base64编码固有的开销:它使用一种新的编码方法在文本消息中填充二进制数据。这种方法消耗了更多的CPU资源,但它成功地将UUEncode的损失从大约40%降低到3.5%(这些数字之间的小数点在监视器上不是污点),同时仍然避免在消息体中使用ANSI控制代码

这可与yEnc相媲美:

yEnc比B-News占用的CPU更少,开销也差不多低,但它并没有避免使用所有的控制代码,它只是剔除了那些(实验上)观察到对某些服务器有不希望的影响的代码,这意味着它比B-News更不符合RFC


    • 简单的答案是:不,现在还没有

      我遇到了将尽可能多的信息编码为JSON字符串的问题,这意味着UTF-8没有控制字符、反斜杠和引号

      我出去研究了可以压缩多少位到有效的UTF-8字节。我不同意关于UTF-8带来太多开销的回答。这不是真的

      如果只考虑单字节序列,它的功能与标准ASCII一样强大。意味着每字节7位。但是如果你删掉所有的特殊字符,你会得到类似于ASCI85的东西

      但在更高的平面上,控制字符较少。因此,如果您使用6字节块,您将能够为每个块编码5字节。在输出中,您将获得任意长度(1到6字节)的UTF-8字符的任意组合

      这将为您提供比Ascii85更好的结果:5/6而不是4/5,83%的效率而不是80%。理论上,更高的数据块长度会更好:19字节的数据块约占84%


      在我看来,编码过程变得太复杂了,但利润却微乎其微。所以Ascii85或它的一些修改版本(我现在正在看)会更好。

      我搜索了最有效的二进制文件转换为tex Raw Encoded 000000 0000000 000001 0000001 ... 100000 0100000 1000010 0100001 1000011 0100010 ... 1111110 1011101 1111111 1011110