Python:如何计算png的crc值
Python: How to calculate png crc value
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
我用这段代码计算了png的crc值
我的 IHDR 块数据是 000008A0 000002FA 08020000 00
,该代码的结果是 0xa1565b1L
然而真正的crc是0x84E42B87
。我用众所周知的 png 检查工具检查了这个值,正确的 crc 是 0x84E42B87
.
我不明白这个值是如何计算和正确的值。
CRC 是根据块类型和数据计算的,而不仅仅是数据。所以这些字节前面会有四个字节 IHDR
。然后你得到正确的CRC。
顺便说一句,我不知道你是如何从 000008A0 000002FA 08020000 00
得到 0xa1565b1L
的。我得到 0xa500050a
作为这些字节的 CRC。一定还有其他地方你做错了。您需要提供一个完整的示例才能让我们知道。
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
我用这段代码计算了png的crc值
我的 IHDR 块数据是 000008A0 000002FA 08020000 00
,该代码的结果是 0xa1565b1L
然而真正的crc是0x84E42B87
。我用众所周知的 png 检查工具检查了这个值,正确的 crc 是 0x84E42B87
.
我不明白这个值是如何计算和正确的值。
CRC 是根据块类型和数据计算的,而不仅仅是数据。所以这些字节前面会有四个字节 IHDR
。然后你得到正确的CRC。
顺便说一句,我不知道你是如何从 000008A0 000002FA 08020000 00
得到 0xa1565b1L
的。我得到 0xa500050a
作为这些字节的 CRC。一定还有其他地方你做错了。您需要提供一个完整的示例才能让我们知道。