RAR version 3.92 -Información Técnica ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EL FORMATO DE ARCHIVO DESCRITO A CONTINUACION ES VÁLIDO SOLO PARA VERSIONES POSTERIORES A LA 1.50 ========================================================================== Formato de los ficheros RAR ========================================================================== Los ficheros están constituidos por bloques de longitud variable. El orden de estos bloques puede variar, pero el primer bloque debe ser siempre un bloque de identificación seguido de un bloque de cabecera de archivo. Cada bloque empieza con los siguientes campos: HEAD_CRC 2 bytes CRC total o parcial del bloque HEAD_TYPE 1 byte Tipo de bloque HEAD_FLAGS 2 bytes Indicaciones del bloque HEAD_SIZE 2 bytes Tamaño del bloque ADD_SIZE 4 bytes Tamaño del campo adicional - tamaño añadido del bloque El campo ADD_SIZE sólo está presente si (HEAD_FLAGS & 0x8000) != 0 El tamaño total del bloque es HEAD_SIZE si (HEAD_FLAGS & 0x8000) == 0 y HEAD_SIZE+ADD_SIZE si el campo ADD_SIZE está presente - cuando (HEAD_FLAGS & 0x8000) != 0. En cada bloque los siguientes bits en HEAD_FLAGS tienen el mismo significado: 0x4000 - Si está activado, antiguas versiones de RAR ignorarán el bloque y lo borrarán cuando el archivo sea actualizado. Si está a cero, el bloque es copiado al nuevo archivo cuando el archivo es actualizado. 0x8000 - Si está activado, el campo ADD_SIZE está presente y el tamaño total del bloque es HEAD_SIZE+ADD_SIZE. Tipos válidos de bloques: HEAD_TYPE=0x72 bloque de identificación HEAD_TYPE=0x73 cabecera de archivo HEAD_TYPE=0x74 cabecera de fichero HEAD_TYPE=0x75 estilo antiguo cabecera de comentario HEAD_TYPE=0x76 estilo antiguo información de autenticidad HEAD_TYPE=0x77 estilo antiguo sub-bloque HEAD_TYPE=0x78 estilo antiguo recuperación de registro HEAD_TYPE=0x79 estilo antiguo información de autenticidad HEAD_TYPE=0x7a sub-bloque El bloque de comentario es usado actualmente sólo dentro de otros bloques y no existe por separado. El proceso del fichero se realiza de la siguiente forma: 1. Leer y comprobar bloque de identificación 2. Leer cabecera de archivo 3. Leer u omitir HEAD_SIZE- tamaño de(MAIN_HEAD) bytes 4. Si se llegó al final del archivo entonces acabar el proceso del archivo, sino, leer 7 bytes en los campos HEAD_CRC, HEAD_TYPE, HEAD_FLAGS, HEAD_SIZE. 5. Comprobar HEAD_TYPE. si HEAD_TYPE==0x74 leer cabecera de fichero (los primeros 7 bytes ya han sido leídos) leer u omitir HEAD_SIZE- tamaño de(FILE_HEAD) bytes si (HEAD_FLAGS & 0x100) leer u omitir HIGH_PACK_SIZE*0x100000000+PACK_SIZE bytes sino leer u omitir PACK_SIZE bytes sino leer el correspondiente bloque HEAD_TYPE: leer HEAD_SIZE-7 bytes si (HEAD_FLAGS & 0x8000) leer ADD_SIZE bytes 6. ir al punto 4. ========================================================================== Formato de los bloques ========================================================================== Bloque de identificación ( MARK_HEAD ) HEAD_CRC Siempre 0x6152 2 bytes HEAD_TYPE Tipo de bloque: 0x72 1 byte HEAD_FLAGS Siempre 0x1a21 2 bytes HEAD_SIZE Tamaño del bloque = 0x0007 2 bytes El bloque de identificación es actualmente considerado como una secuencia fija de bytes: 0x52 0x61 0x72 0x21 0x1a 0x07 0x00 Cabecera de archivo ( MAIN_HEAD ) HEAD_CRC CRC de los campos HEAD_TYPE a RESERVED2 2 bytes HEAD_TYPE Tipo de bloque: 0x73 1 byte HEAD_FLAGS Pequeñas indicaciones: 2 bytes 0x0001 - Atributo de archivo multi-volumen 0x0002 - Comentario de archivo presente RAR 3.x usa el bloqueo separado del comentario y no establece esta indicación. 0x0004 - Atributo de bloqueo del archivo 0x0008 - Atributo de archivo sólido 0x0010 - Nombrar nuevo esquema de volumen ('volname.partN.rar') 0x0020 - Información de autenticidad presente RAR 3.x no establece esta indicación. 0x0040 - Registro de recuperación presente 0x0080 - Cabeceras de bloque son codificadas 0x0100 - Primer volumen (sólo establecido en RAR 3.0 y posteriores) los demás bits de HEAD_FLAGS están reservados para uso interno. HEAD_SIZE Tamaño total de la cabecera del bloque incluyendo comentarios del 2 bytes archivo RESERVED1 Reservado 2 bytes RESERVED2 Reservado 4 bytes Cabecera de fichero (Fichero en el archivo) HEAD_CRC CRC de los campos desde HEAD_TYPE a FILEATTR 2 bytes y el nombre del fichero HEAD_TYPE Tipo de bloque: 0x74 1 byte HEAD_FLAGS Pequeñas indicaciones: 2 bytes 0x01 - El fichero continúa del volumen anterior 0x02 - El fichero continúa en el siguiente volumen 0x04 - Fichero protegido con contraseña 0x08 - Comentario de fichero presente RAR 3.x usa el bloqueo separado del comentario y no establece esta indicación. 0x10 - Se usa información del fichero anterior (indicador de archivo sólido), para RAR 2.00 y posteriores Bits 7 6 5 (RAR 2.0 y posteriores) 0 0 0 - diccionario de 64 Kb 0 0 1 - diccionario de 128 Kb 0 1 0 - diccionario de 256 Kb 0 1 1 - diccionario de 512 Kb 1 0 0 - diccionario de 1024 Kb 1 0 1 - diccionario de 2048 KB 1 1 0 - diccionario de 4096 KB 1 1 1 - el fichero es un directorio 0x100 - Campos HIGH_PACK_SIZE y HIGH_UNP_SIZE están presentes. Estos campos son sólo usados por el archivo para ficheros enormes (más grandes de 2Gb), para ficheros pequeños estos campos están ausentes. 0x200 - FILE_NAME contiene ambos nombres, el Unicode habitual y el codificado, separados por un cero. En este caso si el campo NAME_SIZE es igual a la longitud habitual el nombre más el nombre codificado Unicode más 1 Si esta indicación está presente, pero FILE_NAME difiere de cero bytes, Quiere decir que el nombre del fichero está codificado usando UTF-8. 0x400 - La cabecera contiene 8 bytes adicionales después del nombre del fichero, cuando es requerido para incrementar la seguridad de codificación (también llamado 'salt'). 0x800 - Indicación de versión. Si es fichero de una antigua versión, se añade al fichero un número de versión llamado ';n'. 0x1000 - campo de extensión de tiempo presente. 0x8000 - este bit siempre es determinado, debido a que el tamaño total del bloque es HEAD_SIZE + PACK_SIZE (y más HIGH_PACK_SIZE, si bit 0x100 está determinado) HEAD_SIZE Tamaño total del bloque incluyendo el nombre del 2 bytes fichero y comentarios. PACK_SIZE Tamaño del fichero comprimido 4 bytes UNP_SIZE Tamaño del fichero sin comprimir 4 bytes HOST_OS Sistema operativo usado para comprimir el archivo 1 byte 0 - MS DOS 1 - OS/2 2 - Win32 3 - Unix 4 - Mac OS 5 - BeOS FILE_CRC CRC del fichero 4 bytes FTIME Fecha y hora en formato estándar MS DOS 4 bytes Bits Descripción 0-4 Segundos divididos por 2 5-10 Minutos (0-59) 11-15 Hora (0-23) 16-20 Dia del mes (1-31) 21-24 Mes (1=Enero, ...) 25-31 Años transcurridos desde 1980 UNP_VER Versión de RAR necesaria para extraer el fichero 1 byte La versión necesaria para la extracción está codificada como 10 * versión mayor + versión menor. METHOD Método de compresión 1 byte 0x30 - sin comprimir 0x31 - compresión muy rápida 0x32 - compresión rápida 0x33 - compresión normal 0x34 - buena compresión 0x35 - la mejor compresión NAME_SIZE Tamaño del nombre de fichero 2 bytes ATTR Atributos del fichero 4 bytes HIGH_PACK_SIZE Valor de tamaño 64 bits para fichero comprimido mayor de 4 bytes. 4 bytes Valor opcional, presente sólo si bit 0x100 en HEAD_FLAGS está determinado. HIGH_UNP_SIZE Valor de tamaño 64 bits para fichero descomprimido mayor de 4 bytes. 4 bytes Valor opcional, presente sólo si bit 0x100 en HEAD_FLAGS está determinado. FILE_NAME Nombre del fichero - cadena de longitud NAME_SIZE bytes SALT presente si (HEAD_FLAGS & 0x400) != 0 8 bytes EXT_TIME presente si (HEAD_FLAGS & 0x1000) != 0 tamaño variable otros nuevos campos se pueden añadir aquí. ========================================================================== Notas para aplicaciones ========================================================================== 1. Para procesar archivos SFX es necesario omitir el módulo SFX, buscando el bloque de identificación en el archivo. No hay ninguna secuencia de identificación (0x52 0x61 0x72 0x21 0x1a 0x07 0x00) en el módulo SFX. 2. El CRC se calcula usando el polinomio estándar 0xEDB88320. En el caso de que el tamaño del CRC sea menor de 4 bytes, sólo los bytes de orden más bajo serán usados.