2016-05-31 3 views
0

Вот фрагмент кода моего читателя RFID wiegand на моем малине Pi, который я использую уже.Python reading Wiegand dropping Zeros

def main(): 
    set_procname("Wiegand Reader") 
    global bits 
    global timeout 
    GPIO.add_event_detect(D0, GPIO.FALLING, callback=one) 
    GPIO.add_event_detect(D1, GPIO.FALLING, callback=zero) 
    GPIO.add_event_detect(S1, GPIO.FALLING, callback=unlockDoor) 
    while 1: 
     if bits: 
      timeout = timeout -1 
      time.sleep(0.001) 
      if len(bits) > 1 and timeout == 0: 
       #print "Binary:", int(str(bits),2) 
       c1 = int(str(bits),2) 
       result = ((~c1) >> 1) & 0x0FFFFFF; 
       checkAccess(result, doorID) 
     else: 
      time.sleep(0.001) 



    if __name__ == '__main__': 
     main() 

На обычном USB-считывателе RFID я получаю 0000119994, и это то, что напечатано на карте. Но с этим кодом он читает 119994. Я пробовал несколько карт. Он всегда бросает нули спереди.

Я даже попробовал карту с нулем в ней. 0000120368 и он показывает 120368 Я думал, что он снимает первые 4 персонажа, но затем я попробовал брелок, который имел только 3 нуля впереди. 0004876298 и он читает 4876298. Только опускание передних нулей.

ответ

1

Python удалит передние бит, если они равны нулю, это также относится к целым числам. Например,

>>> a = 0003 
>>> a 
3 
>>> b = 0b0011 
>>> bin(b) 
0b11 

Из того, что я вижу, все RFID будут иметь 10 номеров. Вы можете сделать простую программу, чтобы добавить эти цифры в и сохранить значение в виде строки:

def rfid_formatter(value): 
    str_value = str(value) 
    for s in range(10 - len(str_value)): 
     str_value = "0" + str_value 
    return str_value 

тестовых данных:

print rfid_formatter(120368) 
print "0000120368" 
print rfid_formatter(4876298) 
print "0004876298" 
1

Как уже упоминалось, ведущие нули удаляются в двоичных последовательностей, а также когда вы явно конвертируете строку в десятичную с помощью int().

Что уже не упоминалось в том, что в Python 2.x целые числа с ведущими нулями рассматриваются как восьмеричные значения.

>>> a = 0003 
>>> a 
3 
>>> a = 000127 
>>> a 
87 

Поскольку это вызывало путаницу, неявный восьмеричное преобразование было удалено в Python 3 и любое число ведущих нулей в числовых значений поднимет SyntaxError.

>>> a = 000127 
    File "<stdin>", line 1 
    a = 000127 
      ^
SyntaxError: invalid token 
>>> 

Вы можете прочитать обоснование этих решений в PEP 3127.

В любом случае, я упоминаю все это просто, чтобы прийти к предположению: вы, вероятно, не, работающий с восьмеричными представлениями. Вместо этого я думаю, что вы конвертируете result в строку в checkAccess, чтобы вы могли выполнить сравнение строк. Если это предположение верно, вы можете просто использовать строковый метод zfill (заполнение нуля):

>>> str(119994).zfill(10) 
'0000119994' 
>>> 
>>> str(4876298).zfill(10) 
'0004876298' 
>>>