我目前正在解码二进制文件格式,以便对包含的数据进行一些内部分析。它主要存储整数或双精度数组,并使用某种压缩算法进行存储。当我对他们的压缩算法进行反向工程时,我开始怀疑我是否正在重新发明轮子。这是一个众所周知的压缩算法,我什至可以找到一个现有的C#库来进行读写,还是完全是自制的?
以下是一些示例:
字节[1, 0, 31]
编码整数数组[31]
。第一个字节(1)表示数组由一个数字组成。第二个字节(0)表示数字是一一列出的。第三个字节(31)是列出的数字。 (只要它小于255,就被写为一个字节。)
字节[1, 128, 31]
编码相同的数组,但是第二个字节(128)表示下一个字节应重复1次(第一个字节)。这使我们可以通过将连续的相同数字列出为一个来压缩数组,例如[5, 128, 31]
对数组[31, 31, 31, 31, 31]
进行编码
更多示例:
[5, 0, 1, 2, 3, 4, 5] => [1, 2, 3, 4, 5]
[255, 128, 31] => [31, 31, 31, ..., 31, 31, 31] // (an array of 255 31's)
当数组的长度大于255时,它将以256的倍数添加到第二个字节。
[5, 1, 31] => [31, 31, 31, ..., 31, 31, 31] // (an array of 5 + 256*1 = 261 31's)
这适用于普通和重复数组:
[5, 1, 1, 2, 3, 4, 5, ..., 260, 261] => [1, 2, 3, ..., 260, 261] // (an array with the numbers from 1 to 261)
当数组中的任何数字大于255时,这些数字将分解为256的因数。
[1, 0, 4, 1, 0, 3] => [4 + 256 * 3] => [772]
[3, 0, 4, 17, 0, 3, 128, 2] => [4 + 256*2, 17 + 256*2, 0 + 256*2] => [516, 529, 512]
还有更多的复杂性,尤其是对于双打,但我认为这对于任何知道格式的人来说都是足够的。
有人识别这种二进制序列化/压缩方法吗?它有名字吗?是否有使用此技术的C#库?