Source code for habitat.utils.checksums

# Copyright 2010 (C) Adam Greig
#
# This file is part of habitat.
#
# habitat is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# habitat is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with habitat.  If not, see <http://www.gnu.org/licenses/>.

"""Various checksum calculation utilities."""

import crcmod
from operator import xor as op_xor


[docs]def crc16_ccitt(data): """ Calculate the CRC16 CCITT checksum of *data*. (CRC16 CCITT: start 0xFFFF, poly 0x1021) Returns an upper case, zero-filled hex string with no prefix such as ``0A1B``. >>> crc16_ccitt("hello,world") 'E408' """ crc16 = crcmod.predefined.mkCrcFun('crc-ccitt-false') return hex(crc16(data))[2:].upper().zfill(4)
[docs]def xor(data): """ Calculate the XOR checksum of *data*. Returns an upper case, zero-filled hex string with no prefix such as ``01``. >>> xor("hello,world") '2C' """ numbers = map(ord, data) return hex(reduce(op_xor, numbers))[2:].upper().zfill(2)
[docs]def fletcher_16(data, modulus=255): """ Calculate the Fletcher-16 checksum of *data*, default modulus 255. Returns an upper case, zero-filled hex string with no prefix such as ``0A1B``. >>> fletcher_16("hello,world") '6C62' >>> fletcher_16("hello,world", 256) '6848' """ numbers = map(ord, data) a = b = 0 for number in numbers: a += number b += a a %= modulus b %= modulus return hex((a << 8) | b)[2:].upper().zfill(4)