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

2024-09-28 15:27:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

zlib: compression header fails checksum

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校验和。在


Tags: 图像内容rfcwritebitarraybigzlibba
1条回答
网友
1楼 · 发布于 2024-09-28 15:27:24

您应该仔细阅读错误消息。“压缩头失败校验和”表示错误的是zlib报头,而不是Adler-32的尾部。这个两字节的头包含一个5位的检查值,该值在流中没有正确设置。(或者你完全忘记了标题。)

相关问题 更多 >