Python reading Wiegand dropping Zeros

你说的曾经没有我的故事 提交于 2019-12-12 03:22:43

问题


Here's the code snippet from my RFID wiegand reader on my Raspberry Pi I use already.

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()

On a normal USB RFID reader, I get 0000119994 and that's what's printed on the card. But with this code it reads 119994. I've tried multiple cards. It always drops the zeros at the front .

I even tried a card with a zero in it. 0000120368 and it shows 120368 I thought it was taking off the first 4 characters but then I tried a key fob that only had 3 zeros in front. 0004876298 and it reads 4876298. Only dropping the front zeros.


回答1:


Python will remove the front few bits if they are zero, this also applies to integers. For example

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

From what I see, all RFID's will have 10 numbers. You can make a simple program to add those numbers in and store the value as a string:

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

Your test cases:

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



回答2:


As mentioned already, leading zeros are removed in binary sequences and also when you explicitly convert a string to decimal using int().

What hasn't been mentioned already is that, in Python 2.x, integers with leading zeros are treated as octal values.

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

Since this was causing confusion, the implicit octal conversion was removed in Python 3 and any number of leading zeros in numerical values will raise a SyntaxError.

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

You can read the rationale behind these decisions in PEP 3127.

Anyway, I mention all of this simply to arrive at an assumption: you're probably not working with octal representations. Instead, I think you're converting result to a string in checkAccess so you can do a string comparison. If this assumption is correct, you can simply use the string method zfill (zero fill):

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


来源:https://stackoverflow.com/questions/37535905/python-reading-wiegand-dropping-zeros

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!