2013-08-04 4 views
4

Im чтение данных из tcp-соединения. Если я читаю данные от Wireshark (сетевой монитор) Я получаю 02501c41d11ec06a471102, но если я читаю данные в питоне я получить его в байтах:преобразование байтов в строку

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 в строку юникода. Кроме того, похоже, что обе эти строки одинаковы, Wireshark один только отформатирован как hexadecimals, а 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' 
Смежные вопросы