2009-12-11 21 views

risposta

20

Il formato del file zip è definito da PKWARE. È possibile trovare le specifiche del file here.

Nella parte superiore si trova la specifica intestazione:

A. intestazione del file locale:

local file header signature  4 bytes (0x04034b50) 
    version needed to extract  2 bytes 
    general purpose bit flag  2 bytes 
    compression method    2 bytes 
    last mod file time    2 bytes 
    last mod file date    2 bytes 
    crc-32       4 bytes 
    compressed size     4 bytes 
    uncompressed size    4 bytes 
    file name length    2 bytes 
    extra field length    2 bytes 

    file name (variable size) 
    extra field (variable size) 

Da questo si può vedere che i primi 4 byte di intestazione deve essere la firma del file che dovrebbe essere il valore esadecimale 0x04034b50. L'ordine dei byte nel file è il contrario - PKWARE specifica che "Tutti i valori sono memorizzati nell'ordine byte little-endian se non diversamente specificato.", Quindi se si utilizza un editor esadecimale per visualizzare il file, vedrai 50 4b 03 04 come i primi 4 byte.

È possibile utilizzare questo per verificare se il file è un file zip. Se apri il file nel blocco note, noterai che i primi due byte (50 e 4b) sono i caratteri ASCII PK.

+0

+1 Grandi informazioni. Ma idealmente, sarebbe diverso da un fornitore all'altro, il che significa l'algoritmo di compressione. –

+1

http://en.wikipedia.org/wiki/ZIP_(file_format) –

+4

Il formato del file ZIP non varia da un venditore all'altro. È stato definito in origine da PKWARE, ma molti altri fornitori ora supportano lo stesso formato di compressione. Il formato specifica il PK nell'intestazione, quindi anche altri fornitori includeranno ancora questa parte dell'intestazione. Diversi formati di file come arc, 7z, lhz, gzip ecc avranno specifiche differenti e intestazioni diverse, ma un file zip avrà sempre questo nell'intestazione. –

12

Si potrebbe guardare il file magic number. Quelli per gli archivi ZIP sono elencati su ZIP format wikipedia page: PK\003\004 or PK\005\006.

+0

Sì, ma solo così il know op ... un 'numero magico valida' non garantisce che il file non è danneggiato o di un tipo sbagliato. –

+2

Infatti. Tuttavia, se il loro problema è solo la differenza tra due formati validi, allora il numero magico è la strada da percorrere. – Amber

+0

Non esiste un numero magico per un file zip. Spesso i file zip iniziano con queste sequenze, ma non tutti i file zip lo fanno. – Cheeso

1

Controllare i primi pochi byte del file per magic number. I file zip iniziano con PK (50 4B). Poiché i file XML non possono iniziare con questi caratteri e sono ancora validi, puoi essere abbastanza sicuro del tipo di file.

+1

Non esiste un numero magico per i file zip. Se Wikipedia dice o suggerisce che c'è, è sbagliato. – Cheeso

+1

@Cheeso Sì, c'è. Leggere il formato http://www.pkware.com/documents/casestudies/APPNOTE.TXT e prendere nota della "firma dell'intestazione del file locale" e del relativo valore definito. – Yacoby

+1

Capisco perché lo penseresti, dalla lettura del testo, ma non è corretto. Il testo è sfocato, ma in pratica non esiste un numero magico. http://en.wikipedia.org/wiki/ZIP_(file_format) così come l'esperienza pratica dimostra che stai interpretando le specifiche in modo errato, assumendo un numero magico. Esaminare un archivio autoestraente generato da WinZip o Infozip. È sia un file PE-COFF che un file zip. Usa il numero magico MZ, ma può essere letto come file zip da strumenti ZIP compatibili. – Cheeso

-1

Basta controllare se i primi byte del file sono simboli ASCII o meno. Se lo è, allora hai XML come normale file di testo. In caso contrario, hai dati compressi.

Per situazioni più complesse potrebbe essere necessario controllare lo Magic Number.

+0

* I file ZIP iniziano sempre con 4 byte nell'intervallo ASCII * È possibile che i file ZIP siano composti interamente da byte nell'intervallo ASCII * Cosa succede se il file XML utilizza una codifica che utilizza byte al di fuori dell'intervallo ASCII? Come ogni file UTF8/16/32 con una distinta materiali o con caratteri non latini? –

+0

NO, i file zip non iniziano sempre con 4 byte nell'intervallo ASCII. I file zip NON iniziano sempre sempre con PK o 50 4b. L'equivoco è molto comune, ma è ancora sbagliato. – Cheeso

0

Si potrebbe provare a decomprimerlo - un file XML è estremamente improbabile che sia un file zip valido, oppure potrebbe controllare i numeri magici, come altri hanno già detto.

1

È possibile utilizzare file per vedere se si tratta di un file di testo (XML) o un eseguibile (zip). Scorri verso il basso per vedere un esempio.

+0

oops, ho pensato che ci sarebbe stato anche un file di chiamata di sistema(). – ccheneson

0

dipende da quello che si sta utilizzando, ma la biblioteca zip potrebbe avere una funzione che prova castrato un file o non è un file zip qualcosa come is_zip, test_file_zip o qualunque cosa ...

o creare sei possedere la funzione utilizzando il numero magico sopra indicato.

+0

Non esiste un numero magico per un file zip. – Cheeso

1

Non è una buona soluzione, ma basta pensare al carico ...che dire:

try 
{ 
LoadXmlFile(theFile);//Exception if not an xml file 
} 
catch(Exception ex) 
{ 
LoadZipFile(theFile) 
} 
+0

Ho votato, ma personalmente non mi piace usare try catch per controllare il programma. Sto cercando un test più esatto. Grazie per la tua indicazione, comunque. –

+0

Sono d'accordo: la regola empirica è che il tentativo/cattura non dovrebbe mai essere usato durante il normale flusso del programma * (rallenta le cose di diversi ordini di grandezza e, filosoficamente, è come le unghie su una lavagna). – Contango

1

È possibile controllare il file per vedere se contiene un'intestazione XML valida. In caso contrario, prova a decomprimerlo.

Vedi Click here for XML specification.

Problemi correlati