我需要使用存储在mysql中的数据来控制我的xbee。数据库中包含xbee的长地址,用于标识我在网络上与之通信的xbee。
以下代码完美无缺,但在此示例中,我没有从数据库中检索地址。这只是工作的一个例子。
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr3, #<- this works!
command='D0',
parameter='\x04')
现在,只要从数据库中检索\ x00 \ x13 \ xa2 \ x00 @ \ n!\ x1c(它存储为varchar),我就会收到错误消息: “%(field ['name'],field ['len'])) ValueError:为'dest_addr_long'提供的数据不是8字节长“
这是代码(我包括下面六条打印行的输出以帮助调试)
with con:
cur = con.cursor()
cur.execute("SELECT addrlong, pinStatus FROM deviceStatus WHERE addrlong <>''")
for i in range(cur.rowcount):
row = cur.fetchone()
addr1 = row[0]
Status = row[1]
addr2 = repr(addr1)
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address1: %s" % addr1
print "Address2: %s" % addr2
print "Address3: %s" % addr3
print "Size of Addr1: %s" % sys.getsizeof(addr1)
print "Size of Addr2: %s" % sys.getsizeof(addr2)
print "Size of Addr3: %s" % sys.getsizeof(addr3)
if Status == 0: #turn off
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x04')
if Status == 1: #turn on
xbee.send('remote_at',
frame_id='\x01',
dest_addr_long=addr2, #<-problem is here
command='D0',
parameter='\x05')
,输出
地址1:\ x00 \ x13 \ xa2 \ x00 @ \ n!\ x1c
地址2:'\\ x00 \\ x13 \\ xa2 \\ x00 @ \\ n!\\ x1c'
地址3:?@
<!/ P>
Addr1的大小:45
Addr2的大小:53
Addr3的大小:29
我显然只是尝试dest_addr_long=addr1,
无济于事。
我尝试了很多字符串操作的组合,例如添加和删除括号以及str和repr的几十种组合,但我认为我完全处于错误的路径上。
我想我需要问的是为什么
addr3 = '\x00\x13\xa2\x00@\n!\x1c'
print "Address3: %s" % addr3
输出
地址3:?@ !
一旦我理解了,那么如何操作数据库中的addr1以匹配addr3,因为行dest_addr_long=addr3,
完美无缺。
答案 0 :(得分:1)
这是字节串的ASCII表示。例如,\x00
表示00即NUL,\x13
表示ESC; @
和!
是文字字符,但\n
表示换行符。这是8字节长的方式。
您可以通过使用&#39; string-escape&#39;
进行解码来获取实际字节数>>> s='\x00\x13\xa2\x00@\n!\x1c'
>>> print s.decode('string-escape')
�@
!
(虽然在终端上打印的结果会有所不同)。