【发布时间】:2011-01-22 04:36:16
【问题描述】:
我正在尝试对 LZ1/LZ77 解压缩算法进行逆向工程。要输出的解码缓冲区/窗口区域的长度在文件中编码为可变长度整数。我已经尽可能多地阅读了有关可变长度整数编码的内容,并且在这种情况下使用的方法似乎与我见过的任何其他方法不同。也许是为了避免专利问题,或者只是为了混淆视听。包含的代码可能不是很完整,但目前至少可以处理几个文件。
我看不出如何(如果有的话)下面使用的公式可以简化为更简单的东西。大多数可变长度整数编码算法都使用某种循环,但对于这个,我无法做到这一点,因为在评估每个半字节时,公式似乎并不一致。
非常感谢您的建议。
private static int getLength(BitReader bitStream)
{
const int minSize = 2;
int length = 0;
byte nibble3, nibble2, nibble1;
nibble3 = bitStream.ReadNibble();
if (nibble3 >= 0xc)
{
nibble2 = bitStream.ReadNibble();
nibble1 = bitStream.ReadNibble();
if (nibble3 == 0xF & nibble2 == 0xF & nibble1 == 0xF) return -1;
if ((nibble3 & 2) != 0)
{
length = (((((nibble3 & 7) + 3) << 6) + 8)) +
((nibble2 & 7) << 3) + nibble1 + minSize;
}
else if ((nibble3 & 1) != 0)
{
length = (((nibble3 & 7) << 6) + 8) +
((((nibble2 & 7)) + 1) << 3) + nibble1 + minSize;
}
else
{
length = ((((nibble3 & 7) << 4) + 8)) +
((nibble2 & 7) << 4) + nibble1 + minSize;
}
}
else if ((nibble3 & 8) != 0)
{
nibble1 = bitStream.ReadNibble();
length = ((((nibble3 & 7) << 1) + 1) << 3) + nibble1 + minSize;
}
else
{
length = nibble3 + minSize;
}
return length;
}
【问题讨论】:
-
你可以对这个进行逆向工程吗?
-
是的。这是我数据库中的数据。我不是在拆解源应用程序,只是在处理我自己的数据。
标签: c# encoding compression integer bit-manipulation