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