我正在压缩由数据包组成的二进制流
一个数据包由 256 个 32 位整数(样本)组成。问题是大多数整数与前一个整数相比仅更改了几位(通常,与流中的前一个样本相比,0 - 4 位最多更改)。
这是一个例子:
3322 2222 2222 1111 1111 1110 0000 0000 BIT POSITIONS
1098 7654 3210 9817 6543 2109 8765 4321
--------------------------------------------------------
1100 1001 1110 0010 0001 0101 0110 1101 Sample 1
* *
1100 1001 1110 1010 0001 0101 0110 0101 Sample 2 changes: bit 19, 4
1100 1001 1110 1010 0001 0101 0110 0101 Sample 3 changes: none
* * *
1100 0001 1110 1011 0001 0101 0010 0101 Sample 4 changes: bit 27, 17, 7
...
我目前的无损压缩方案是基于半字节的。基本上我使用的是一个控制字节,我正在编码 - 使用单个位 - 它的半字节从前一个样本发生了变化;如果有变化,我将在压缩流中包含修改后的半字节,否则它们将在解压缩时从先前的样本中重建。
以下是我提供的示例流的压缩方式:
Control Byte: 11111111 // all nibbles change, since this is first sample
Data: 1100 1001 1110 0010 0001 0101 0110 1101 // data for all nibbles
Control Byte: 00010001 // only nibbles 3 and 7 have changes
Data: 1010 0101 // data for nibbles 3 and 7
Control Byte: 00000000 // no nibbles are changing
Data: // no data is required
Control Byte: 01010010 // nibbles 1, 3 and 6 have changes
Data: 0001 1011 0010 // nibbles 1, 3 and 6
...
使用这种方案,我们有 256 字节(控制字节)的固定开销,平均可变压缩数据长度为 260 字节(从样本到样本变化的半字节)。考虑到未压缩数据包的长度为 1024 字节,这实际上给了我们 50% 的平均压缩率。
这还不错,但我的直觉是可能有更好的方法。有没有人知道更好的压缩策略,它利用了很少有位从样本到样本的变化这一事实?只要解压缩后的误码率很小(小于 3%),有损压缩就是一种替代方案——对于这个特定的数据流,位位置的数值权重是无关紧要的,因此在较高位中发生的错误是完全不用担心。
提前谢谢大家!