2012-10-31 13 views
5

Penso che ci sia un modo per farlo ma non sono sicuro di come? Fondamentalmente, stavo scrivendo un programma di compressione che ha provocato un errore crc quando ho provato a decomprimere i dati compressi. Normalmente questo significa che il decompressore ha effettivamente riconosciuto i miei dati come nel formato corretto e lo ha decompresso, ma quando ha confrontato il risultato con la lunghezza prevista, come indicato dal CRC, non erano gli stessi.Forza gzip per decomprimere nonostante l'errore CRC

Tuttavia, per ragioni di confronto, in realtà voglio vedere l'output per vedere se si tratta solo di un problema di concatenazione (che dovrebbe essere relativamente ovvio se l'output decompresso non è senza senso ma solo nell'ordine sbagliato).

risposta

0

Per quanto ne so, il controllo CRC fa parte del wrapper GZIP, non fa parte dei dati compressi effettivi nel formato DEFLATE.

Quindi dovresti essere in grado di prendere letteralmente solo i byte che sono il flusso di dati compresso, ignorando l'intestazione GZIP e il CRC alla fine e passarlo attraverso un Inflater.

In altre parole, è necessario prendere solo i byte corrispondenti a quelli indicati come "blocchi compressi" nello GZIP File format specification e provare a decomprimere utilizzando un oggetto Inflater Java. Un po 'di lavoro ma forse meno della ricompilazione del codice GZIP come suggerisce Greg (anche se la sua opzione funzionerebbe anche in linea di principio).

8

Hai detto "decomprimere", ma la domanda dice "gzip". Cos'è questo? Questi sono due programmi diversi che operano su due formati diversi. Assumerò gzip. Anche la lunghezza non è "indicata dal CRC". Il trailer di gzip contiene un CRC e una lunghezza non compressa (modulo 2), che sono due cose diverse.

Il comando gzip decomprimerà tutti i dati di svuotamento validi e lo scriverà prima di controllare il crc. Quindi se, per esempio, prendo un file .gz e corrotto solo il CRC (o lunghezza) alla fine, e faccio:

gzip -dc <corrupt.gz> result 

poi risultato sarà l'intero, corretto flusso di dati non compressi. Non è necessario modificare e ricompilare gzip, né scrivere il proprio ungzipper. gzip si lamenterà del crc, ma tutti i dati verranno comunque scritti.