Python 阅读 Wiegand 丢零
Python reading Wiegand dropping Zeros
这是我的 Raspberry Pi 上我的 RFID wiegand reader 的代码片段,我已经在使用了。
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 reader 上,我得到 0000119994,这就是卡上打印的内容。但使用此代码,它显示为 119994。我试过多张卡。它总是在前面删除零。
我什至试过一张有零的卡片。 0000120368 它显示 120368
我以为它会去掉前 4 个字符,但后来我尝试了一个前面只有 3 个零的钥匙扣。 0004876298,它显示为 4876298。只删除前面的零。
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"
如前所述,二进制序列中的前导零被删除,当您使用 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'
>>>
这是我的 Raspberry Pi 上我的 RFID wiegand reader 的代码片段,我已经在使用了。
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 reader 上,我得到 0000119994,这就是卡上打印的内容。但使用此代码,它显示为 119994。我试过多张卡。它总是在前面删除零。
我什至试过一张有零的卡片。 0000120368 它显示 120368 我以为它会去掉前 4 个字符,但后来我尝试了一个前面只有 3 个零的钥匙扣。 0004876298,它显示为 4876298。只删除前面的零。
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"
如前所述,二进制序列中的前导零被删除,当您使用 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'
>>>