二进制运行长度编码

时间:2011-09-29 14:18:52

标签: math binary compression run-length-encoding

我有一个Web表单,我希望在Base64中生成一个简短表示的内容。除其他外,表单包含264个二进制值的列表,其中大部分值在任何时候都将为0。 (它们代表地理地图上的区域)。即使在Base64中,这个264位数也会产生一个长而令人生畏的字符串。我想尽可能有效地实现行程编码。你能帮帮我吗?我用谷歌搜索了二进制RLE,但没有发现任何用处。

我到目前为止尝试了什么 - 使用十进制计数在二进制字符串上运行RLE,并使用“A”作为分隔符,表示0到1之间的更改,然后将结果从基数11转换为base 64.例如:

00000000001111111000000010000000000000000000000001111111110001111010101000000000000000000000000000000000000111111111110111000000000000111111100000001000000000000000000000000111111111000111101010100000000000000000000000000000000000011111111111011100

变为

10A5A5AA22A7A1A2AAAAAAA34A9AA1A10A5A5AA22A7A1A2AAAAAAA34A9AA1A

反过来成为

CNnbr/FxkgbbOw0LNAKgk65P8SdvaTG+t74o

或者,在62中,

6imo7zq1pqr2mqglTHzXwJRAksm7fvHZHWQK

它更好,但我仍然不禁怀疑我做错了什么 - 使用数字“A”作为分隔符是最好的方法吗?

另一次更新:

感谢 @comingstorm ,我已经缩短了压缩字符串。

ILHHASCAASBYwwccDASYgAEgWDI=

正如我在评论中提到的,实际使用情况通常会导致更短的字符串。

3 个答案:

答案 0 :(得分:6)

由于您正在编码位,因此您可能希望使用基于位的RLE而不是基于字节的RLE。在这种情况下,您应该考虑Elias gamma coding(或其某些变体)来有效地编码运行长度。

您的编码格式的合理的第一个近似值可能是:

  • 第一位=与未压缩字符串的第一位相同(设置初始极性)
  • 剩余比特:Elias编码的连续比特运行长度(交替1和0)

由于您知道未压缩字符串中有多少位,因此您不需要终止代码;你可以添加任意二进制填充作为任意位。

请注意,运行长度“压缩”总是可以扩展您的位串;如果您对此感到担心,可以添加另一个初始位来指示您的数据是处于压缩格式还是未压缩格式,将压缩开销限制为1位。

答案 1 :(得分:1)

264位,只有33个字节,并且在base64中只有44个字节。我认为这个(非常小的)信息量很难压缩。稀疏表示nulvinge也只是存储非零元素及其值(因为你只有0/1),即在你的情况下只是非零位的索引。但是因为你有264个可能的位 - 你需要9位的索引,这意味着,如果你有超过29个非零条目,你需要已经超过原始。

也许你的问题是错误的,但我不知道264位如何导致一个令人生畏的base64字符串(你如何生成它 - 也许你翻译的不是264位,而是264个ASCII字符(值{{1} }和0) - 这可以解释你的长结果字符串?)。

答案 2 :(得分:0)

我认为你想要的另一种选择是稀疏矩阵: http://en.wikipedia.org/wiki/Sparse_matrix