rewrite CRC function

This commit is contained in:
Junzi Sun 2019-07-09 15:02:06 +02:00
parent 24806f7e88
commit 0b7b9ad3dd
2 changed files with 25 additions and 54 deletions

View File

@ -1,8 +1,6 @@
from __future__ import absolute_import, print_function, division
import numpy as np
from pyModeS.decoder import fastcrc
from textwrap import wrap
def hex2bin(hexstr):
"""Convert a hexdecimal string to binary string, with zero fillings."""
@ -60,17 +58,37 @@ def crc(msg, encode=False):
int: message checksum, or partity bits (encoder)
"""
# the CRC generator
G = [
int("11111111", 2), int("11111010", 2),
int("00000100", 2), int("10000000", 2)
]
if encode:
msg = msg[:-6] + "000000"
reminder_int = fastcrc.crc(msg)
msgbin = hex2bin(msg)
msgbin_split = wrap(msgbin, 8)
mbytes = list(map(bin2int, msgbin_split))
return reminder_int
for ibyte in range(len(mbytes)-3):
for ibit in range(8):
mask = 0x80 >> ibit
bits = mbytes[ibyte] & mask
if bits > 0:
mbytes[ibyte] = mbytes[ibyte] ^ (G[0] >> ibit)
mbytes[ibyte+1] = mbytes[ibyte+1] ^ (0xFF & ((G[0] << 8-ibit) | (G[1] >> ibit)))
mbytes[ibyte+2] = mbytes[ibyte+2] ^ (0xFF & ((G[1] << 8-ibit) | (G[2] >> ibit)))
mbytes[ibyte+3] = mbytes[ibyte+3] ^ (0xFF & ((G[2] << 8-ibit) | (G[3] >> ibit)))
result = (mbytes[-3] << 16) | (mbytes[-2] << 8) | mbytes[-1]
return result
def crc_legacy(msg, encode=False):
"""Mode-S Cyclic Redundancy Check. (Legacy code, slow)."""
"""Mode-S Cyclic Redundancy Check. (Legacy code, 2x slow)."""
# the polynominal generattor code for CRC [1111111111111010000001001]
generator = np.array([1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1,0,0,1])
ng = len(generator)

View File

@ -1,47 +0,0 @@
"""Compute CRC checksum of a hexadecimal string."""
GENERATOR = [
int("11111111", 2), int("11111010", 2),
int("00000100", 2), int("10000000", 2)
]
class BytesWrapper:
def __init__(self, hexstr):
self._bytes = [int(hexstr[i:i+2], 16) for i in range(0, len(hexstr), 2)]
def byte_count(self):
return len(self._bytes) - 3
def get_bit(self, byte_index, bit_index):
mask = 0x80 >> bit_index
bits = self._bytes[byte_index] & mask
return 0 if bits == 0 else 1
def apply_matrix(self, byte_index, bit_index):
self._bytes[byte_index] = self._bytes[byte_index] ^ (GENERATOR[0] >> bit_index)
self._bytes[byte_index + 1] = self._bytes[byte_index + 1] ^ \
(0xFF & ((GENERATOR[0] << 8 - bit_index) | (GENERATOR[1] >> bit_index)))
self._bytes[byte_index + 2] = self._bytes[byte_index + 2] ^ \
(0xFF & ((GENERATOR[1] << 8 - bit_index) | (GENERATOR[2] >> bit_index)))
self._bytes[byte_index + 3] = self._bytes[byte_index + 3] ^ \
(0xFF & ((GENERATOR[2] << 8 - bit_index) | (GENERATOR[3] >> bit_index)))
def get_suffix(self):
return (self._bytes[-3] << 16) | (self._bytes[-2] << 8) | self._bytes[-1]
def crc(msg):
msgbin = BytesWrapper(msg)
for byte_index in range(msgbin.byte_count()):
for bit_index in range(8):
b = msgbin.get_bit(byte_index, bit_index)
if b == 1:
msgbin.apply_matrix(byte_index, bit_index)
result = msgbin.get_suffix()
return result