deal with Python 2 long int

This commit is contained in:
Junzi Sun
2019-09-10 13:31:27 +02:00
parent 458b02028d
commit 0eb333ba8c
+90 -43
View File
@@ -2,6 +2,7 @@ from __future__ import absolute_import, print_function, division
import numpy as np import numpy as np
from textwrap import wrap from textwrap import wrap
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."""
num_of_bits = len(hexstr) * 4 num_of_bits = len(hexstr) * 4
@@ -16,7 +17,8 @@ def hex2int(hexstr):
def int2hex(n): def int2hex(n):
"""Convert a integer to hexadecimal string.""" """Convert a integer to hexadecimal string."""
return hex(n)[2:].rjust(6, '0').upper() # strip 'L' for python 2
return hex(n)[2:].rjust(6, "0").upper().rstrip("L")
def bin2int(binstr): def bin2int(binstr):
@@ -36,7 +38,7 @@ def bin2np(binstr):
def np2bin(npbin): def np2bin(npbin):
"""Convert a binary numpy array to string.""" """Convert a binary numpy array to string."""
return np.array2string(npbin, separator='')[1:-1] return np.array2string(npbin, separator="")[1:-1]
def df(msg): def df(msg):
@@ -60,8 +62,10 @@ def crc(msg, encode=False):
""" """
# the CRC generator # the CRC generator
G = [ G = [
int("11111111", 2), int("11111010", 2), int("11111111", 2),
int("00000100", 2), int("10000000", 2) int("11111010", 2),
int("00000100", 2),
int("10000000", 2),
] ]
if encode: if encode:
@@ -71,16 +75,22 @@ def crc(msg, encode=False):
msgbin_split = wrap(msgbin, 8) msgbin_split = wrap(msgbin, 8)
mbytes = list(map(bin2int, msgbin_split)) mbytes = list(map(bin2int, msgbin_split))
for ibyte in range(len(mbytes)-3): for ibyte in range(len(mbytes) - 3):
for ibit in range(8): for ibit in range(8):
mask = 0x80 >> ibit mask = 0x80 >> ibit
bits = mbytes[ibyte] & mask bits = mbytes[ibyte] & mask
if bits > 0: if bits > 0:
mbytes[ibyte] = mbytes[ibyte] ^ (G[0] >> ibit) mbytes[ibyte] = mbytes[ibyte] ^ (G[0] >> ibit)
mbytes[ibyte+1] = mbytes[ibyte+1] ^ (0xFF & ((G[0] << 8-ibit) | (G[1] >> ibit))) mbytes[ibyte + 1] = mbytes[ibyte + 1] ^ (
mbytes[ibyte+2] = mbytes[ibyte+2] ^ (0xFF & ((G[1] << 8-ibit) | (G[2] >> ibit))) 0xFF & ((G[0] << 8 - ibit) | (G[1] >> ibit))
mbytes[ibyte+3] = mbytes[ibyte+3] ^ (0xFF & ((G[2] << 8-ibit) | (G[3] >> 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] result = (mbytes[-3] << 16) | (mbytes[-2] << 8) | mbytes[-1]
@@ -90,7 +100,35 @@ def crc(msg, encode=False):
def crc_legacy(msg, encode=False): def crc_legacy(msg, encode=False):
"""Mode-S Cyclic Redundancy Check. (Legacy code, 2x 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)
msgnpbin = bin2np(hex2bin(msg)) msgnpbin = bin2np(hex2bin(msg))
@@ -99,12 +137,12 @@ def crc_legacy(msg, encode=False):
msgnpbin[-24:] = [0] * 24 msgnpbin[-24:] = [0] * 24
# loop all bits, except last 24 piraty bits # loop all bits, except last 24 piraty bits
for i in range(len(msgnpbin)-24): for i in range(len(msgnpbin) - 24):
if msgnpbin[i] == 0: if msgnpbin[i] == 0:
continue continue
# perform XOR, when 1 # perform XOR, when 1
msgnpbin[i:i+ng] = np.bitwise_xor(msgnpbin[i:i+ng], generator) msgnpbin[i : i + ng] = np.bitwise_xor(msgnpbin[i : i + ng], generator)
# last 24 bits # last 24 bits
reminder = bin2int(np2bin(msgnpbin[-24:])) reminder = bin2int(np2bin(msgnpbin[-24:]))
@@ -140,7 +178,7 @@ def icao(msg):
elif DF in (0, 4, 5, 16, 20, 21): elif DF in (0, 4, 5, 16, 20, 21):
c0 = crc(msg, encode=True) c0 = crc(msg, encode=True)
c1 = hex2int(msg[-6:]) c1 = hex2int(msg[-6:])
addr = '%06X' % (c0 ^ c1) addr = "%06X" % (c0 ^ c1)
else: else:
addr = None addr = None
@@ -149,23 +187,33 @@ def icao(msg):
def is_icao_assigned(icao): def is_icao_assigned(icao):
"""Check whether the ICAO address is assigned (Annex 10, Vol 3).""" """Check whether the ICAO address is assigned (Annex 10, Vol 3)."""
if (icao is None) or (not isinstance(icao, str)) or (len(icao)!=6): if (icao is None) or (not isinstance(icao, str)) or (len(icao) != 6):
return False return False
icaoint = hex2int(icao) icaoint = hex2int(icao)
if 0x200000 < icaoint < 0x27FFFF: return False # AFI if 0x200000 < icaoint < 0x27FFFF:
if 0x280000 < icaoint < 0x28FFFF: return False # SAM return False # AFI
if 0x500000 < icaoint < 0x5FFFFF: return False # EUR, NAT if 0x280000 < icaoint < 0x28FFFF:
if 0x600000 < icaoint < 0x67FFFF: return False # MID return False # SAM
if 0x680000 < icaoint < 0x6F0000: return False # ASIA if 0x500000 < icaoint < 0x5FFFFF:
if 0x900000 < icaoint < 0x9FFFFF: return False # NAM, PAC return False # EUR, NAT
if 0xB00000 < icaoint < 0xBFFFFF: return False # CAR if 0x600000 < icaoint < 0x67FFFF:
if 0xD00000 < icaoint < 0xDFFFFF: return False # future return False # MID
if 0xF00000 < icaoint < 0xFFFFFF: return False # future if 0x680000 < icaoint < 0x6F0000:
return False # ASIA
if 0x900000 < icaoint < 0x9FFFFF:
return False # NAM, PAC
if 0xB00000 < icaoint < 0xBFFFFF:
return False # CAR
if 0xD00000 < icaoint < 0xDFFFFF:
return False # future
if 0xF00000 < icaoint < 0xFFFFFF:
return False # future
return True return True
def typecode(msg): def typecode(msg):
"""Type code of ADS-B message """Type code of ADS-B message
@@ -197,7 +245,7 @@ def cprNL(lat):
nz = 15 nz = 15
a = 1 - np.cos(np.pi / (2 * nz)) a = 1 - np.cos(np.pi / (2 * nz))
b = np.cos(np.pi / 180.0 * abs(lat)) ** 2 b = np.cos(np.pi / 180.0 * abs(lat)) ** 2
nl = 2 * np.pi / (np.arccos(1 - a/b)) nl = 2 * np.pi / (np.arccos(1 - a / b))
NL = floor(nl) NL = floor(nl)
return NL return NL
@@ -234,10 +282,10 @@ def idcode(msg):
B4 = mbin[30] B4 = mbin[30]
D4 = mbin[31] D4 = mbin[31]
byte1 = int(A4+A2+A1, 2) byte1 = int(A4 + A2 + A1, 2)
byte2 = int(B4+B2+B1, 2) byte2 = int(B4 + B2 + B1, 2)
byte3 = int(C4+C2+C1, 2) byte3 = int(C4 + C2 + C1, 2)
byte4 = int(D4+D2+D1, 2) byte4 = int(D4 + D2 + D1, 2)
return str(byte1) + str(byte2) + str(byte3) + str(byte4) return str(byte1) + str(byte2) + str(byte3) + str(byte4)
@@ -261,15 +309,14 @@ def altcode(msg):
# Altitude code, bit 20-32 # Altitude code, bit 20-32
mbin = hex2bin(msg) mbin = hex2bin(msg)
mbit = mbin[25] # M bit: 26 mbit = mbin[25] # M bit: 26
qbit = mbin[27] # Q bit: 28 qbit = mbin[27] # Q bit: 28
if mbit == "0": # unit in ft
if mbit == '0': # unit in ft if qbit == "1": # 25ft interval
if qbit == '1': # 25ft interval
vbin = mbin[19:25] + mbin[26] + mbin[28:32] vbin = mbin[19:25] + mbin[26] + mbin[28:32]
alt = bin2int(vbin) * 25 - 1000 alt = bin2int(vbin) * 25 - 1000
if qbit == '0': # 100ft interval, above 50175ft if qbit == "0": # 100ft interval, above 50175ft
C1 = mbin[19] C1 = mbin[19]
A1 = mbin[20] A1 = mbin[20]
C2 = mbin[21] C2 = mbin[21]
@@ -284,10 +331,10 @@ def altcode(msg):
B4 = mbin[30] B4 = mbin[30]
D4 = mbin[31] D4 = mbin[31]
graystr = D2 + D4 + A1 + A2 + A4 + B1 + B2 + B4 + C1 + C2 + C4 graystr = D2 + D4 + A1 + A2 + A4 + B1 + B2 + B4 + C1 + C2 + C4
alt = gray2alt(graystr) alt = gray2alt(graystr)
if mbit == '1': # unit in meter if mbit == "1": # unit in meter
vbin = mbin[19:25] + mbin[26:31] vbin = mbin[19:25] + mbin[26:31]
alt = int(bin2int(vbin) * 3.28084) # convert to ft alt = int(bin2int(vbin) * 3.28084) # convert to ft
@@ -308,20 +355,20 @@ def gray2alt(codestr):
if n100 == 7: if n100 == 7:
n100 = 5 n100 = 5
if n500%2: if n500 % 2:
n100 = 6 - n100 n100 = 6 - n100
alt = (n500*500 + n100*100) - 1300 alt = (n500 * 500 + n100 * 100) - 1300
return alt return alt
def gray2int(graystr): def gray2int(graystr):
"""Convert greycode to binary.""" """Convert greycode to binary."""
num = bin2int(graystr) num = bin2int(graystr)
num ^= (num >> 8) num ^= num >> 8
num ^= (num >> 4) num ^= num >> 4
num ^= (num >> 2) num ^= num >> 2
num ^= (num >> 1) num ^= num >> 1
return num return num
@@ -355,8 +402,8 @@ def wrongstatus(data, sb, msb, lsb):
""" """
# status bit, most significant bit, least significant bit # status bit, most significant bit, least significant bit
status = int(data[sb-1]) status = int(data[sb - 1])
value = bin2int(data[msb-1:lsb]) value = bin2int(data[msb - 1 : lsb])
if not status: if not status:
if value != 0: if value != 0: