summaryrefslogtreecommitdiffstats
path: root/glucometerutils/drivers/lifescan_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'glucometerutils/drivers/lifescan_common.py')
-rw-r--r--glucometerutils/drivers/lifescan_common.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/glucometerutils/drivers/lifescan_common.py b/glucometerutils/drivers/lifescan_common.py
index 9a60ab6..f37903a 100644
--- a/glucometerutils/drivers/lifescan_common.py
+++ b/glucometerutils/drivers/lifescan_common.py
@@ -26,3 +26,27 @@ class InvalidSerialNumber(exceptions.Error):
"""The serial number is not as expected."""
def __init__(self, serial_number):
self.message = 'Serial number %s is invalid.' % serial_number
+
+
+def crc_ccitt(data):
+ """Calculate the CRC-16-CCITT with LifeScan's common seed.
+
+ Args:
+ data: (bytes) the data to calculate the checksum of
+
+ Returns:
+ (int) The 16-bit integer value of the CRC-CCITT calculated.
+
+ This function uses the non-default 0xFFFF seed as used by multiple
+ LifeScan meters.
+ """
+ crc = 0xffff
+
+ for byte in data:
+ crc = (crc >> 8) & 0xffff | (crc << 8) & 0xffff
+ crc ^= byte
+ crc ^= (crc & 0xff) >> 4
+ crc ^= (((crc << 8) & 0xffff) << 4) & 0xffff
+ crc ^= (crc & 0xff) << 5
+
+ return (crc & 0xffff)