Недвоичные (шестнадцатеричные) символы в строке, полученные через TCP с Python - PullRequest
0 голосов
/ 11 октября 2010

возможно, это вопрос noob, но я получаю некоторые данные по TCP, и когда я смотрю на строку, я получаю следующее:

\x00\r\xeb\x00\x00\x00\x00\x01t\x00

Что это за символ \r и что означает t в \x01t?

Я пробовал поискать в Google, но я не уверен, что искать в Google ...

спасибо.

Ответы [ 3 ]

9 голосов
/ 11 октября 2010

\r - возврат каретки (0x0d), t - t.

4 голосов
/ 11 октября 2010

Просмотр двоичных данных в строках может иногда приводить в замешательство, особенно если они длинные, но вы всегда можете преобразовать их в какой-то более легкий для чтения гекс.

>>> data = '\x00\r\xeb\x00\x00\x00\x00\x01t\x00'
>>> ' '.join(["%02X" % ord(char) for char in data])
'00 0D EB 00 00 00 00 01 74 00'

Также, есливы просто разбираете строку байта в полях, просто игнорируете строку и просто идете прямо к ее распаковке с помощью модуля struct:

>>> import struct
>>> length, command, eggs, spam = struct.unpack('!BBi4s',data)
>>> #...whatever your fields really are
>>> print "len: %i\ncmd: %i\negg qty: %i\nspam flavor: '%s'" % (
...     length, command, eggs, spam)
len: 0
cmd: 13
egg qty: -352321536
spam flavor: ' ☺t '
2 голосов
/ 11 октября 2010

При отображении данных в виде строки печатаемые символы (например, 't') отображаются в виде символов, известные управляющие последовательности отображаются как экранированные символы, а другие байты отображаются в форме \ x ##. Пример:

>>> s='\x74\x0d\x99'
>>> s
't\r\x99'

Вы можете сбросить шестнадцатеричную форму с помощью:

>>> import binascii
>>> binascii.hexlify(s)
'740d99'
...