操作 python 中的字符串

Manipulate strings in python

我需要使用 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),我就会收到一条错误消息: "% (字段['name'],字段['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')

输出为

Address1: \x00\x13\xa2\x00@\n!\x1c

Address2: '\x00\x13\xa2\x00@\n!\x1c'

Address3: ?@

!

Size of Addr1: 45

Size of Addr2: 53

Size of Addr3: 29

我显然只是简单地尝试了 dest_addr_long=addr1, 但无济于事。

我已经尝试了多种字符串操作组合,例如添加和删除括号以及 str 和 repr 的数十种组合,但我认为我完全走错了路。

我想我需要问的是为什么

addr3 = '\x00\x13\xa2\x00@\n!\x1c' print "Address3: %s" % addr3

输出

Address3: ?@ !

一旦我理解了这一点,那么我该如何操作数据库中的 addr1 以匹配 addr3,因为行 dest_addr_long=addr3, 工作得很好。

这是一个字节串的 ASCII 表示。例如\x00表示00即NUL,\x13表示ESC; @! 是文字字符,但 \n 表示换行符。这就是它的 8 个字节长。

您可以通过使用 'string-escape':

解码来取回实际字节
>>> s='\x00\x13\xa2\x00@\n!\x1c'
>>> print s.decode('string-escape')
�@
!

(尽管打印结果在终端上看起来会有所不同)。