rewrite CRC function
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
from __future__ import absolute_import, print_function, division
|
from __future__ import absolute_import, print_function, division
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from textwrap import wrap
|
||||||
from pyModeS.decoder import fastcrc
|
|
||||||
|
|
||||||
|
|
||||||
def hex2bin(hexstr):
|
def hex2bin(hexstr):
|
||||||
"""Convert a hexdecimal string to binary string, with zero fillings."""
|
"""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)
|
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:
|
if encode:
|
||||||
msg = msg[:-6] + "000000"
|
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):
|
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]
|
# 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])
|
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)
|
ng = len(generator)
|
||||||
|
|||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user