簡単な答え:(1)「deflate」と「32Kbwindow」がデフォルトです(2)crc32ではなくadler32を使用します
長い答え:
"" "PNG仕様では、32768バイトのウィンドウサイズでzlibのdeflateメソッドを使用してIDATデータを圧縮する必要がありますが、Pythonzlibモジュールでこれらのパラメーターを設定する方法が見つかりません。"""
それらを設定する必要はありません。これらがデフォルトです。
本当にzlibにデフォルト以外の引数を指定したい場合は、zlib.compressobj()を使用できます...Pythonドキュメントに記載されていないいくつかの引数があります。読み物:
ソース:Pythonのgzip.py(zlib.compressobjの呼び出し方法を参照)
ソース:Pythonのzlibmodule.c(デフォルトを参照)
SO:この質問(MizardXと私自身による回答、およびそれぞれについてのコメントを参照してください)
docs:zlibサイトのマニュアル
"" "各チャンクのCRCについては、zlibモジュールのドキュメントにCRC関数が含まれていることが示されています。そのCRC関数をcrc32(data、-1)として呼び出すと、必要なCRCが生成されると思いますが、必要に応じてPNG仕様で指定されたCコードを変換できます。"" "
zlib仕様(別名RFC 1950)をチェックしてください...使用されるチェックサムはadler32であると書かれています
zlib compressまたはcompressobj出力には、適切なCRCが含まれます。なぜあなたは自分でそれをする必要があると思いますか?
編集したがって、CRC-32が必要です。良いニュース:zlib.crc32()がその仕事をします:
コード:
import zlib
crc_table = None
def make_crc_table():
global crc_table
crc_table = [0] * 256
for n in xrange(256):
c = n
for k in xrange(8):
if c & 1:
c = 0xedb88320L ^ (c >> 1)
else:
c = c >> 1
crc_table[n] = c
make_crc_table()
"""
/* Update a running CRC with the bytes buf[0..len-1]--the CRC
should be initialized to all 1's, and the transmitted value
is the 1's complement of the final running CRC (see the
crc() routine below)). */
"""
def update_crc(crc, buf):
c = crc
for byte in buf:
c = crc_table[int((c ^ ord(byte)) & 0xff)] ^ (c >> 8)
return c
# /* Return the CRC of the bytes buf[0..len-1]. */
def crc(buf):
return update_crc(0xffffffffL, buf) ^ 0xffffffffL
if __name__ == "__main__":
tests = [
"",
"\x00",
"\x01",
"Twas brillig and the slithy toves did gyre and gimble in the wabe",
]
for test in tests:
model = crc(test) & 0xFFFFFFFFL
zlib_result = zlib.crc32(test) & 0xFFFFFFFFL
print (model, zlib_result, model == zlib_result)
Python2.7からの出力は以下のとおりです。Python 2.1〜2.6および1.5.2JFTHOIでもテストされています。
(0L, 0L, True)
(3523407757L, 3523407757L, True)
(2768625435L, 2768625435L, True)
(4186783197L, 4186783197L, True)