En teoría ese mensaje se muestra porque la longitud descomprimida no coincide con la indicada en el fichero, pero eso no significa que esté mal, de ahí que se muestre como "WARNING" y no como "ERROR". La diferencia es que la advertencia te genera el fichero comprimido y el error no. Seguramente algún byte de más o menos en los bytes que guardan la longitud y que no afectan en nada, pero luego lo miro con más calma para asegurarme. También habría que mirar si los ficheros se usan o no, que no sería la primera vez que me encuentro con ficheros basura que te hacen perder el tiempo y al final no son más que simples ficheros residuales cortados que no valen para nada, aunque no creo que sea el caso.
~~~ AÑADIDO ~~~
Pues a simple vista se ve el problema, que no lo es. La longitud indicada en los ficheros, bytes 1-2-3, es de 0x00C000 (49152 bytes) pero en realidad debería ser de 0x004391 (17297 bytes). Tiene toda la pinta de que lo han alineado a un múltiplo de 0x4000 por equivocación.
Si descomprimes el fichero y vuelves a comprimirlo te queda idéntico al original. La única diferencia es la longitud almacenada en la cabecera y que los originales que me has pasado tienen un byte más porque están alineados a 0x4000, curiosamente como el valor equivocado de la longitud almacenada. No puede ser casualidad, así que me inclino a pensar que es un bug tonto. OJO, que también puede ser que el fichero esté cortado, pero eso es algo que ya no puedo saber, y la longitud real sí sea de 0x00C000.
Ya me debes 3 cerveza más
~~~ MÁS AÑADIDO ~~~
¡¡¡So melón!!! Los ficheros están cortados. En realidad son dos ficheros idénticos, que extraídos deben ocupar 0xB794 bytes, y se descomprimen sin ningún tipo de advertencia.
Para sacarlos, sin descomprimir:
// aquí se debe tener:
// - buffer <--- fichero en memoria, unsigned char
// - length <--- longitud del fichero, unsigned int
// total, pos, len, i <-- unsigned int
total = *(unsigned int *)buffer >> 3;
for (i = 0; i < total; i++) {
pos = *(unsigned int *)(buffer + 8 * i);
len = i < total - 1 ? *(unsigned int *)(buffer + 8 * (i + 1)) : length;
len -= pos;
// aquí se graba el fichero, 'len' bytes a partir de 'buffer + pos'
// Save(i, buffer + pos, len);
}
(el último fichero sobra, pero es la costumbre de hacer todo en medio minuto)
Ya son otras 3 cerveza más