2010-10-11 63 views
0

也許這是一個noob問題,但我通過TCP接收的一些數據,當我看串,我得到以下幾點:非二進制(十六進制)字符收到了TCP與Python

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

什麼是\r字符?\x01t中的t是什麼意思?

我嘗試過谷歌搜索,但我不知道該怎麼爲谷歌...

感謝。

+0

有什麼編碼? – 2010-10-11 14:03:41

+2

看起來不像我能想到的任何編碼(一行中有四個NULL字節?)。看起來更像是二進制數據,我會說... – 2010-10-11 14:06:37

+0

這是我從一個TCP服務器的流量模擬器得到的響應,我必須根據長度(第一個字節)和命令(第二個字節),那麼我怎麼解釋'r'和't'? – 2010-10-11 14:10:21

回答

4

查看字符串中的二進制數據有時可能會造成混淆,尤其是如果它們很長,但您始終可以將其轉換爲一些易於閱讀的十六進制。

>>> 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 ' 
9

\r是回車(0x0d),tt

+0

如果是這樣的話,爲什麼不把它簡單地作爲0x0d? – 2010-10-11 14:11:05

+1

因爲有一個標準轉義,所以爲它指定'\ r'。搜索「C字符轉義」,你會發現他們如何表示的表格。 – Blrfl 2010-10-11 14:22:05

+3

@nieldw Python將'bytes'對象表示爲標識每個字節的十六進制值的字符串,除非十六進制值是可打印/常用ASCII值的十六進制值。 – 2010-10-11 14:30:28

2

顯示數據時作爲字符串,可打印字符(如't'顯示爲字符,已知的控制序列顯示爲轉義字符,其他字節顯示在\ x ##表格中。例如:

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

你可以轉儲以十六進制形式:

>>> import binascii 
>>> binascii.hexlify(s) 
'740d99' 
相關問題