Calcular / validar bz2 (bzip2) CRC32 en Python

Estoy tratando de calcular / validar las sumas de verificación CRC32 para archivos comprimidos de bzip2.

.magic:16                       = 'BZ' signature/magic number
.version:8                      = 'h' for Bzip2 ('H'uffman coding)
.hundred_k_blocksize:8          = '1'..'9' block-size 100 kB-900 kB

.compressed_magic:48            = 0x314159265359 (BCD (pi))
.crc:32                         = checksum for this block
...
... 
.eos_magic:48                   = 0x177245385090 (BCD sqrt(pi))
.crc:32                         = checksum for whole stream
.padding:0..7                   = align to whole byte

http://en.wikipedia.org/wiki/Bzip2

Entonces sé dónde están las sumas de verificación CRC en un archivo bz2, pero ¿cómo haría para validarlas? ¿Qué trozos debobinascii.crc32() para obtener ambos CRC? He intentado calcular el CRC de varios fragmentos, byte a byte, pero no he logrado obtener una coincidencia.

Gracias. Estaré buscando en las fuentes de bzip2 ybz2 Código de la biblioteca de Python, para encontrar algo, especialmente en eldecompress() método.

Actualización 1:

Los encabezados de bloque se identifican por las siguientes etiquetas hasta donde puedo ver.Pero los pequeños archivos bz2 no contienen los ENDMARK. (Gracias aadw, descubrimos que uno debe buscar valores desplazados en bits de ENDMARK, ya que los datos comprimidos no se rellenan en bytes).

#define BLOCK_HEADER_HI  0x00003141UL
#define BLOCK_HEADER_LO  0x59265359UL

#define BLOCK_ENDMARK_HI 0x00001772UL
#define BLOCK_ENDMARK_LO 0x45385090UL

Esto es de labzlib2recover.c fuente, los bloques parecen comenzar siempre en el bit 80, justo antes de la suma de comprobación de CRC, que debe omitirse del cálculo de CRC, ya que no se puede CRC su propio CRC para ser el mismo CRC (entiendo mi punto).

searching for block boundaries ...
block 1 runs from 80 to 1182

Mirando el código que calcula esto.

Actualización 2:

bzlib2recover.c no tiene las funciones de cálculo de CRC, solo copia el CRC de los archivos dañados. Sin embargo, logré replicar la funcionalidad de la calculadora de bloques en Python, para marcar los bits iniciales y finales de cada bloque en unbz2 archivo comprimido. De vuelta a la pista, he encontrado quecompress.c se refiere a algunas de las definiciones enbzlib_private.h.

#define BZ_INITIALISE_CRC(crcVar) crcVar = 0xffffffffL;
#define BZ_FINALISE_CRC(crcVar) crcVar = ~(crcVar);
#define BZ_UPDATE_CRC(crcVar,cha)              \
{                                              \
   crcVar = (crcVar << 8) ^                    \
            BZ2_crc32Table[(crcVar >> 24) ^    \
                           ((UChar)cha)];      \
}

Se accede a estas definiciones porbzlib.c también,s->blockCRC se inicializa y actualiza enbzlib.c y finalizado encompress.c. Hay más de 2000 líneas de código C, lo que llevará un tiempo revisar y descubrir qué entra y qué no. Estoy agregando elC etiqueta a la pregunta también.

Por cierto, aquí están las fuentes C para bzip2http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

Actualización 3:

Resultabzlib2 El bloque CRC32 se calcula utilizando el siguiente algoritmo:

dataIn son los datos a codificar.

crcVar = 0xffffffff # Init
    for cha in list(dataIn):
        crcVar = crcVar & 0xffffffff # Unsigned
        crcVar = ((crcVar << 8) ^ (BZ2_crc32Table[(crcVar >> 24) ^ (ord(cha))]))

    return hex(~crcVar & 0xffffffff)[2:-1].upper()

Donde BZ2_crc32Table se define encrctable.c

pordataIn = "justatest" el CRC devuelto es7948C8CB, después de comprimir un archivo de texto con esos datos, la suma de comprobación crc: 32 dentro del archivo bz2 es79 48 c8 cb que es un partido

Conclusión:

bzlib2 CRC32 es (citandocrctable.c)

Derivado vagamente del código de Rob Warnock, en la Sección 51 de las preguntas frecuentes de comp.compression ...

... por lo tanto, por lo que yo entiendo, no se puede calcular / validar previamente utilizando calculadoras de suma de verificación CRC32 estándar, sino que requieren elbz2lib implementación (líneas 155-172 enbzlib_private.h)

Respuestas a la pregunta(1)

Su respuesta a la pregunta