Checksum code
Robin Becker
robin at jessikat.fsnet.co.uk
Tue May 28 06:00:39 EDT 2002
In fact I was wrong and in practice the (0L+x+y)&0xFFFFFFFFL code didn't
seem to work out for all data streams. It seems easier to just use the
protected 32bit code all the time ie
def _add32(x, y):
"Calculate (x + y) modulo 2**32"
lo = (x & 0xFFFF) + (y & 0xFFFF)
hi = (x >> 16) + (y >> 16) + (lo >> 16)
return (hi << 16) | (lo & 0xFFFF)
def calcChecksum(data):
"""Calculates PDF-style checksums"""
if len(data)&3: data = data + (4-(len(data)&3))*"\0"
sum = 0
for n in unpack(">%dl" % (len(data)>>2), data):
lo = (sum & 0xFFFF) + (n & 0xFFFF)
hi = (sum >> 16) + (n >> 16) + (lo >> 16)
sum = (hi << 16) | (lo & 0xFFFF)
return sum
--
Robin Becker
More information about the Python-list
mailing list