Estoy intentando realizar una ingeniería inversa de un algoritmo de descompresión LZ1/LZ77. La longitud de un área de la memoria intermedia/ventana de decodificación a emitir se codifica en el archivo como un entero de longitud variable. He leído todo lo que puedo sobre la codificación de enteros de longitud variable y el método que se utiliza en este caso no parece ser como los que he visto. Tal vez para evitar problemas de patentes o tal vez solo para ofuscar. El código incluido puede no estar completo, pero está trabajando en al menos varios archivos en este punto.Codificación de entero de longitud variable
No puedo ver cómo, en todo caso, las fórmulas que se utilizan a continuación podrían reducirse a algo más simple. La mayoría de los algoritmos de codificación de enteros de longitud variable utilizan algún tipo de bucle, pero para este, no he podido hacer eso porque la fórmula no parece ser consistente cuando se evalúa cada mordisco.
Las sugerencias son muy apreciadas.
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;
}
¿Se le permite realizar una ingeniería inversa? – TFD
Sí. Son mis datos en mi base de datos. No estoy desmontando la aplicación fuente, simplemente trabajando con mis propios datos. –