Краткий ответ: (1) по умолчанию "deflate" и "окно 32Kb" (2) использует adler32, а не crc32
Длинный ответ:
""«Спецификация PNG ТРЕБУЕТ, чтобы данные IDAT были сжаты с помощью метода deflate zlib с размером окна 32768 байт, но я не могу найти, как установить эти параметры в модуле Python zlib.» »«
Выне нужно устанавливать их.Это значения по умолчанию.
Если вы действительно хотите указать аргументы не по умолчанию для zlib, вы можете использовать zlib.compressobj () ... у него есть несколько аргументов, которые не описаны в документации по Python.Материал для чтения:
источник: Python's gzip.py (посмотрите, как он вызывает zlib.compressobj)
source: Python's zlibmodule.c (см.по умолчанию)
SO: Этот вопрос (см. ответы MizardX и меня и комментарии к каждому)
документы: руководство на zlib site
"" "Что касается CRC для каждого чанка, документация модуля zlib указывает, что он содержит функцию CRC. Я считаю, что вызов этой функции CRC как crc32 (data, -1) сгенерирует нужный мне CRC, хотя при необходимости я могу перевести код C, указанный в спецификации PNG. "" "
Пожалуйста, ознакомьтесь с спецификацией zlib aka RFC 1950 ... он говорит, что используется контрольная сумма adler32
Вывод zlib compress или compressobj будет включать в себя соответствующий CRC;почему вы думаете, что вам нужно будет сделать это самостоятельно?
Edit Итак, вам нужен 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)
Вывод из Python 2.7 ниже.Также протестировано с Python 2.1 до 2.6 включительно и 1.5.2 JFTHOI.
(0L, 0L, True)
(3523407757L, 3523407757L, True)
(2768625435L, 2768625435L, True)
(4186783197L, 4186783197L, True)