字节转换为字符串

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

你从字节开始。.decode('utf-8') 表示从 UTF-8 解码为 Unicode 字符串。此外,这两个字符串看起来很相似,Wireshark 的字符串只是全部格式化为十六进制,而 Python 的字符串则混合了 \x 转义和可打印字符。 - millimoose
1个回答

4
使用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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接