Zlib压缩标头失败校验和,错误为-3

时间:2018-01-30 13:18:22

标签: python compression png zlib deflate

我试图在python使用Fixed Huffman编写我自己的deflate实现。当我将图像打包回.png文件时,常规图像查看器中没有显示任何内容。每个块头都是根据RFC-1950的规范形成的。 我使用pngcheck来找出图像为什么没有显示任何内容并得到这两条消息:

  

zlib:压缩标头失败校验和

     

zlib:inflate_error = -3

对于Adler32值,我将其计算为zlib.adler32(bytearray(scanline))。另一件令我困惑的事情是压缩流的字节顺序,我不完全确定如何在字节内打包固定的霍夫曼代码位,我知道它是在RFC-1951中指定的。

#zLibHeaderArray = bytearray([CMF,FLG])
zLibHeaderArray = bytearray([78,1])
outputPNG.write(zLibHeaderArray)

#First three bits per block
outputBitStream = ba.bitarray(endian = 'big')

if(isLast != 1):
    outputBitStream += ba.bitarray('001')
else:
    outputBitStream += ba.bitarray('101')

#-- here i transform the input scanline with lz77 and huffman and load it into the big endian bitarray

outputBitStream += ba.bitarray(getHuffman(256,huffman))
outputBitStream.tofile(outputPNG)
#Adler32 Checksum

adler32Value = zlib.adler32(bytearray(scanline))
a1, a2, a3, a4 = (adler32Value & 0xFFFFFFFF).to_bytes(4, 'big')

adler32Array = bytearray([a1,a2,a3,a4])
outputPNG.write(adler32Array)

CRC不会导致iDAT块的错误,所以我最好的猜测是Adler32校验和。

1 个答案:

答案 0 :(得分:2)

您应该仔细阅读错误消息。 “压缩标头失败校验和”表示它是zlib 标头不正确,而不是预告片是Adler-32。该双字节标头包含未在流中正确设置的五位检查值。 (或者你可能完全忘记了标题。)