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

时间:2016-09-30 06:14:37

标签: python-2.7 python-3.x encoding character-encoding

我想通过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中一样再次转义?

谢谢

3 个答案:

答案 0 :(得分:0)

' STR' python 3中的对象不是字节序列,而是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

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

答案 1 :(得分:0)

有一个适用于Python2和Python3的标准解决方案。无需进口: hex_string = """ 16 03 02 """ some_bytes = bytearray.fromhex(hex_string)

在python3中,您可以将其视为 str (对其进行切片,迭代等),也可以添加字节字符串:b'\x00'b'text'或{{1 }}

您还提到了一些有关编码“ utf-8”的内容。因此,您可以轻松地做到这一点: bytes('text','utf8')

您可以看到不需要清洁它。此功能非常有效。如果要返回十六进制字符串:some_bytes.encode()会为您完成。

答案 2 :(得分:-1)

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

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