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