2013-08-04 242 views
4

正在從tcp連接讀取數據。如果我從Wireshark的讀取數據(網絡監控器)我得到02501c41d11ec06a471102但如果我在Python中讀取數據我得到它以字節爲單位:將字節轉換爲字符串

b'\x02P\x1cA\xd1\x1e\xc0jG\x11\x02' 
<class 'bytes'> 

如何轉換呢? 我嘗試這樣做:

#!/usr/bin/env python 

import socket 
import binascii 
import time 
import sys 

TCP_IP = '10.20.0.195' 
TCP_PORT = 9761 
BUFFER_SIZE = 2048 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((TCP_IP, TCP_PORT)) 

while 1: 
    data = s.recv(1024) 
    print (data) 
    data2 = data.decode("utf-8") 
    typ = type(data) 
    print (typ) 

,但如果在運行此我得到:

b'\x02P\x1cA\xd1\x00\x00\x02\xcb\x11\x00' 
Traceback (most recent call last): 
    File "Z:/programeren/domotica/try again/receive.py", line 18, in <module> 
    data2 = data.decode("utf-8") 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 4: invalid continuation byte 

只是要清楚,我想轉

b'\x02P\x1cA\xd1\x00\x00\x02\xcb\x11\x00' 

02501c41d11ec06a471102 
+0

你開始的字節。 '.decode('utf-8')'表示從** UTF-8解碼爲一個Unicode字符串。另外,看起來這兩個字符串都是相同的 - ish,Wireshark一個只是全部格式化爲十六進制,而Python則有'\ x'轉義和可打印字符的混合。 – millimoose

回答

3

使用binascii.b2a_hex(或binascii.hexlify)。

>>> import binascii 
>>> binascii.b2a_hex(b'\x02P\x1cA\xd1\x00\x00\x02\xcb\x11\x00') 
b'02501c41d1000002cb1100' 
>>> binascii.b2a_hex(b'\x02P\x1cA\xd1\x00\x00\x02\xcb\x11\x00').decode('ascii') 
'02501c41d1000002cb1100'