Python 3 中的 Python 2 str.decode('hex')?

问题描述 投票:0回答:3

我想通过Python中的套接字将十六进制编码的数据发送到另一个客户端。我前段时间在 python 2 中成功完成了所有操作。现在我想将其移植到 python 3。

数据如下所示:

""" 16 03 02 """

然后我用这个函数把它变成一个字符串:

x.replace(' ', '').replace('\n', '').decode('hex')

它看起来像这样(顺便说一下,这是一个 str 类型):

'\x16\x03\x02'

现在我设法在 python 3 中找到了这个:

codecs.decode('160302', 'hex')

但它返回另一种类型:

b'\x16\x03\x02'

由于我编码的所有内容都不是正确的语言,因此我无法使用 utf-8 或某些解码器,因为其中存在无效字节(例如 \x00、\xFF)。关于如何像 python 2 一样再次转义字符串解决方案有什么想法吗?

谢谢

python-2.7 python-3.x encoding character-encoding
3个回答
0
投票

python 3 中的“str”对象不是字节序列,而是 unicode 代码点序列。

如果“发送数据”是指调用

send
,那么
bytes
是正确的使用类型。

如果你确实想要字符串(不是 3 个字节,而是 12 个 unicode 代码点):

>>> import codecs
>>> s = str(codecs.decode('16ff00', 'hex'))[2:-1]
>>> s
'\\x16\\xff\\x00'
>>> print(s)
\x16\xff\x00

请注意,您需要使用双反斜杠才能在代码中表示它们。


0
投票

Python2 和 Python3 有一个标准解决方案。无需进口:


hex_string = """ 16 03 02 """
some_bytes = bytearray.fromhex(hex_string)

在 python3 中,您可以将其视为 str (切片、迭代等),您也可以添加字节字符串:

b'\x00'
b'text'
bytes('text','utf8')

您还提到了有关编码“utf-8”的内容。所以你可以轻松地做到这一点:

some_bytes.encode()

如您所见,您不需要清洁它。这个功能非常有效。如果您想返回十六进制字符串:

some_bytes.hex()
将为您完成。


-1
投票
a = """ 16 03 02 """.encode("utf-8")
#Send things over socket
print(a.decode("utf-8"))

为什么不用UTF-8编码,用socket发送,再用UTF-8解码?

© www.soinside.com 2019 - 2024. All rights reserved.