2015-01-22 2 views
1

Мне нужно управлять моим xbee, используя данные, хранящиеся в mysql. В базу данных входит длинный адрес xbee, который используется для определения того, с каким xbee я общаюсь с сетью.Манипулировать строки в python

Следующий код работает отлично, но в этом примере я не получаю адрес из базы данных. Это всего лишь пример того, что работает.

addr3 = '\x00\x13\xa2\[email protected]\n!\x1c' 
xbee.send('remote_at', 
        frame_id='\x01', 
        dest_addr_long=addr3, #<- this works! 
        command='D0', 
        parameter='\x04') 

Теперь, как только я получить \ x00 \ x13 \ xa2 \ x00 @ \ п \ 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\[email protected]\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\[email protected]\n!\x1c

Address2: '\\x00\\x13\\xa2\\[email protected]\\n!\\x1c'

Address3: [email protected]

!

Size of Addr1: 45

Size of Addr2: 53

Size of Addr3: 29

Я, очевидно, пробовал просто dest_addr_long=addr1, безрезультатно.

Я пробовал много комбинаций струнных манипуляций, таких как добавление и удаление скобок и десятки комбинаций str и repr, но я думаю, что я нахожусь на неправильном пути полностью.

Я думаю, что мне нужно, чтобы спросить, почему

addr3 = '\x00\x13\xa2\[email protected]\n!\x1c' print "Address3: %s" % addr3

выход

Address3: [email protected] !

и как только я понимаю, что, тогда как я могу манипулировать ADDR1 из базы данных, чтобы соответствовать addr3, потому что линия dest_addr_long=addr3, работает отлично.

ответ

1

Это представление ASCII байтовой строки. \x00, например, означает 00, то есть NUL, а \x13 - ESC; @ и ! являются буквальными символами, но \n означает символ новой строки. Вот как это 8 байтов.

Вы можете получить фактические байты обратно при декодировании с помощью «шнуровки побега»:

>>> s='\x00\x13\xa2\[email protected]\n!\x1c' 
>>> print s.decode('string-escape') 
�@ 
! 

(хотя результат печати будет выглядеть на терминале).

+0

Бинго - один простой и правильный ответ. Спасибо, теперь я могу заняться вещами. –

Смежные вопросы