Me he encontrado con un pequeño problema con la compresión gzip.
Digamos que comprimimos la letra 'a' con la biblioteca pako en javascript, de la siguiente manera:
pako.gzip('a')Esto devuelve la siguiente matriz de bytes:
[31,139,8,0,0,0,0,0,0,3,75,4,0,67,190,183,232,1,0,0,0]Ahora, si tomo esta matriz y la descomprimo en python, obtengo el resultado esperado:
import gzip arr_from_pako = bytearray([31,139,8,0,0,0,0,0,0,3,75,4,0,67,190,183,232,1,0,0,0]) decompressed = gzip.decompress(arr_from_pako) print(decompressed) >>> b'a'Sin embargo, si invierto el proceso y comprimo con gzip el resultado en python, obtengo un bytearray diferente:
arr_from_python = list(gzip.compress(decompressed)) print(arr_from_python) >>> [31, 139, 8, 0, 123, 15, 138, 98, 2, 255, 75, 4, 0, 67, 190, 183, 232, 1, 0, 0, 0]Lo que necesito hacer aquí es reproducir el resultado de pako.gzip en python. Supongo que las diferencias se deben a un nivel de compresión y sé que gzip lib en python te permite ajustarlo, pero probé todas las configuraciones y no pude obtener el resultado esperado.
¿Alguien puede ayudar?
No puedes, y no necesitas hacerlo. No hay problema.
La diferencia en los ejemplos que das está solo en el encabezado gzip, donde Python está poniendo un tiempo de modificación y configurando algunos otros bytes en el encabezado con valores diferentes a los de pako. Puede usar mtime=0 en Python para deshacerse del tiempo de modificación, pero aún tendrá esas otras diferencias. ( 0, 3 vs. 2, 255 : esos son los indicadores XFL y OS en el encabezado).
Puede reescribir manualmente el encabezado en Python para que sea igual que gzip. Sin embargo, eso aún no cumplirá su objetivo a largo plazo, una vez que esté comprimiendo cantidades razonables de datos. Entonces, incluso si obliga a que los encabezados sean iguales, los datos comprimidos pueden ser y probablemente serán diferentes. La única forma de asegurarse de que los datos comprimidos sean los mismos es que usted tenga personalmente el control de las bibliotecas utilizadas tanto en Python como en pako, asegúrese de que sean el mismo código fuente, la misma versión de ese código fuente y que sean utilizando exactamente los mismos parámetros de control. Dudo que lo seas, por lo que estás en una tontería para tratar de hacer que sean iguales.
No hay necesidad de hacerlos iguales. Todo lo que necesita de un compresor sin pérdidas es compresión seguida de descompresión para darle exactamente lo que pone. Eso es todo. Tienes eso. Nunca hay ninguna garantía de la otra dirección, es decir, que puede obtener la descompresión seguida de la compresión para obtener lo mismo.