0

这是我已经使用的 Raspberry Pi 上的 RFID wiegand 阅读器的代码片段。

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。只删除前面的零。

4

2 回答 2

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'
>>> 
于 2016-05-31T09:48:35.907 回答
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"
于 2016-05-31T02:53:33.847 回答