我正在压缩由数据包组成的二进制流。
每个数据包由256个32位整数(样本)组成。问题在于,大多数整数与前一个整数仅有少量位不同(通常仅有0-4位是不同的)。
以下是一个例子:
使用这种方案,我们有256字节(控制字节)的固定开销,平均可变压缩数据长度为260字节(从样本到样本改变的半字节)。考虑到未压缩数据包的长度为1024字节,这实际上给了我们一个50%的平均压缩率。
这并不差,但我的直觉是还有更好的方法。是否有人知道一种更好的压缩策略可以利用样本之间非常少的位数变化?损失压缩是一个选择,只要解压缩后的比特误差率很小(小于3%),对于这个特定的数据流,比特位置的数字权重是无关紧要的,因此高位发生的错误根本不重要。
提前感谢大家!
每个数据包由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%),对于这个特定的数据流,比特位置的数字权重是无关紧要的,因此高位发生的错误根本不重要。
提前感谢大家!