答案 0 :(得分:3)
你基本上有两种可变长度整数的替代方案:
使用每个k
的1位作为结束终止符。例如,谷歌protobuf就是这样做的(在他们的例子中,每个字节都有一位,所以每个字节有7个有用的位)。
首先输出位长,然后输出位。这就是ASN.1的工作原理,除了以表格1表示的OID。
如果数字可能非常大,则选项2更好,虽然它更复杂并且您必须递归地应用它,因为您可能必须输出长度的长度,然后输出长度,然后输出数字。一种常见的技术是对长度字段使用选项1(位标记)。
对于较小的数字,选项1更好。考虑大多数数字适合64位的情况。每字节存储7位的开销是1/7;有八个字节,你代表56位。使用甚至长度的7/8表示也将表示八个字节中的56位:一个长度字节和七个数据字节。任何短于48位的数字都将受益于自终止代码。
无限长度的“真正随机数”平均来说是无限长的,所以这可能不是你所拥有的。更有可能的是,您对数字大小的概率分布有所了解,并可以在上述选项之间进行选择。
请注意,这些“压缩”都没有(除了相对于臃肿的ascii-decimal格式)。 log n/n
的渐近线为0,因此数字越大,数字大小的大小往往不占用(相对)空间。但它仍然需要以某种方式表示,因此总表示将总是比数字的log 2 大一点。
答案 1 :(得分:0)
你不能压缩本身,但你可以编码,这可能是你正在寻找的。您有由换行符分隔的ASCII十进制数字序列的文件。你应该只是霍夫曼编码字符。你不会做得比每个字符大约3.5位更好。