在python中处理字符串

时间:2015-01-22 17:47:12

标签: python mysql pyserial

我需要使用存储在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,完美无缺。

1 个答案:

答案 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')
�@
!

(虽然在终端上打印的结果会有所不同)。