forked from CMS/memberPlumbing
Properly handle parity bits in codeToHex
This commit is contained in:
parent
667260831c
commit
8367c8bbc1
24
doorUtil.py
24
doorUtil.py
@ -1,21 +1,35 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
import bitstring
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
import csv
|
import csv
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
from common import *
|
from common import *
|
||||||
|
|
||||||
def hexToCode(hex):
|
# Reference for H10301 card format:
|
||||||
b = bin(int(hex, 16))[2:]
|
# https://www.hidglobal.com/sites/default/files/hid-understanding_card_data_formats-wp-en.pdf
|
||||||
facility = int(b[0:8], 2)
|
|
||||||
code = int(b[9:24], 2)
|
|
||||||
|
def hexToCode(h):
|
||||||
|
b = bitstring.Bits(hex=h)
|
||||||
|
facility = b[7:15].uint
|
||||||
|
code = b[15:31].uint
|
||||||
return ((facility, code))
|
return ((facility, code))
|
||||||
|
|
||||||
|
|
||||||
def codeToHex(facility, code):
|
def codeToHex(facility, code):
|
||||||
return "{:08X}".format(int(bin(facility)[2:] + "0" + bin(code)[2:] + "1", 2))
|
b = bitstring.pack('0b000000, uint:1, uint:8, uint:16, uint:1', 0,
|
||||||
|
facility, code, 0)
|
||||||
|
# calculate parity bits
|
||||||
|
b[6] = b[7:19].count(1) % 2 # even parity
|
||||||
|
b[31] = not (b[19:31].count(1) % 2) # odd parity
|
||||||
|
return b.hex.upper()
|
||||||
|
|
||||||
|
|
||||||
# hexToCode("01E29DA1") <-> codeToHex(241, 20176)
|
# hexToCode("01E29DA1") <-> codeToHex(241, 20176)
|
||||||
|
|
||||||
|
|
||||||
def forEachDoor(fxn):
|
def forEachDoor(fxn):
|
||||||
for door in doors.values():
|
for door in doors.values():
|
||||||
print(door.name)
|
print(door.name)
|
||||||
|
Loading…
Reference in New Issue
Block a user