2009-12-11 23 views

Respuesta

20

El formato de archivo zip está definido por PKWARE. Puede encontrar su especificación de archivo here.

En la parte superior se encuentra la especificación de cabecera:

A. encabezado del archivo local:

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) 

De esto se puede ver que los primeros 4 bytes de la cabecera debe estar la firma del archivo que debe ser el valor hexadecimal 0x04034b50. El orden de bytes en el archivo es al revés: PKWARE especifica que "Todos los valores se almacenan en bytes pequeños a menos que se especifique lo contrario", por lo que si usa un editor hexadecimal para ver el archivo, verá 50 4b 03 04 como los primeros 4 bytes.

Puede usar esto para verificar si su archivo es un archivo zip. Si abre el archivo en el bloc de notas, notará que los primeros dos bytes (50 y 4b) son los caracteres ASCII PK.

+0

+1 Excelente información. Pero idealmente, variaría de un proveedor a otro, lo que significa el algoritmo de compresión. –

+1

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

+4

El formato del archivo ZIP no varía de un proveedor a otro. Fue originalmente definido por PKWARE, pero muchos otros proveedores ahora admiten el mismo formato de compresión. El formato especifica el PK en el encabezado, por lo que incluso otros proveedores seguirán incluyendo esta parte del encabezado. Los diferentes formatos de archivo como arc, 7z, lhz, gzip, etc. tendrán diferentes especificaciones y diferentes encabezados, pero un archivo zip siempre tendrá esto en el encabezado. –

12

Puede consultar el archivo magic number del archivo. Los de los archivos ZIP se enumeran en el ZIP format wikipedia page: PK\003\004 or PK\005\006.

+0

Sí, pero sólo por lo que saben op ... un 'número mágico válido' no garantiza que el archivo no está dañado o de un tipo incorrecto. –

+2

De hecho. Sin embargo, si su problema es simplemente diferenciar entre dos formatos válidos, entonces el número mágico es el camino a seguir. – Amber

+0

No hay un número mágico para un archivo zip. A menudo, los archivos zip comienzan con estas secuencias, pero no todos los archivos zip. – Cheeso

1

Compruebe los primeros bytes del archivo para magic number. Los archivos zip comienzan con PK (50 4B). Como los archivos XML no pueden comenzar con estos caracteres y aún así ser válidos, puede estar bastante seguro del tipo de archivo.

+1

No hay un número mágico para los archivos zip. Si Wikipedia dice o sugiere que existe, está mal. – Cheeso

+1

@ Cheeso Sí, hay. Lea el formato http://www.pkware.com/documents/casestudies/APPNOTE.TXT y observe la "firma del encabezado del archivo local" y su valor definido. – Yacoby

+1

Entiendo por qué pensaría eso al leer el texto, pero no es correcto. El texto es borroso, pero en la práctica, no hay un número mágico. http://en.wikipedia.org/wiki/ZIP_(file_format), así como la experiencia práctica demuestra que está interpretando las especificaciones incorrectamente, al asumir un número mágico. Examine un archivo autoextraíble generado por WinZip o Infozip. Es a la vez un archivo PE-COFF y un archivo zip. Utiliza el número mágico de MZ, pero puede leerse como un archivo zip mediante herramientas ZIP compatibles. – Cheeso

-1

Simplemente compruebe si los primeros bytes del archivo son símbolos ASCII o no. Si es así, entonces tiene XML como archivo de texto normal. Si no, has comprimido los datos.

Para situaciones más complicadas, puede que necesite comprobar el Magic Number.

+0

* Los archivos ZIP siempre comienzan con 4 bytes en el rango ASCII * Es posible que los archivos ZIP estén compuestos enteramente de bytes en el rango ASCII * ¿Qué ocurre si el archivo XML utiliza una codificación que utiliza bytes fuera del rango ascii? Como cualquier archivo UTF8/16/32 con una lista de materiales o con caracteres no latinos? –

+0

NO, los archivos zip no siempre comienzan con 4 bytes en el rango ASCII. Los archivos Zip NO siempre comienzan siempre con PK o 50 4b. El malentendido es muy común, pero aún está mal. – Cheeso

0

Puede intentar descomprimirlo: es muy poco probable que un archivo XML sea un archivo zip válido, o podría verificar los números mágicos, como han dicho otros.

1

Usted puede utilizar file para ver si es un archivo de texto (XML) o un ejecutable (zip). Desplácese hacia abajo para ver un ejemplo.

+0

Vaya, también pensé que habría un archivo de llamada al sistema(). – ccheneson

0

depende de lo que usted está utilizando, pero la biblioteca de cremallera que tenga una función que probar wether un archivo o no es un archivo zip algo así como is_zip, test_file_zip o lo que sea ...

o cree que está propia función mediante el uso del número mágico dado anteriormente.

+0

No hay un número mágico para un archivo zip. – Cheeso

1

No es una buena solución, pero solo pensar en cargar ...¿qué tal:

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

He votado esto, pero personalmente no me gusta usar try catch para controlar el programa. Estoy buscando una prueba más exacta. Gracias por tu aporte. –

+0

Estoy de acuerdo: la regla general es que try/catch nunca se debe usar durante el flujo de programa * normal * (ralentiza las cosas en varios órdenes de magnitud y, filosóficamente, es como las uñas en una pizarra). – Contango

Cuestiones relacionadas