Python 2.7 Python3 ByTestStreams和UDP

Python 2.7 Python3 ByTestStreams和UDP,python-2.7,python-3.x,udp,Python 2.7,Python 3.x,Udp,我正在尝试发送一个需要以十六进制形式到达目的地的数据包,格式如下: 01 02 a1 a2 b1 b2 在Python2中,要发送的UDP方法是: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.send(message, (UDP_IP, UDP_Port)) 消息可以传递一个十六进制字符串,如: \x01\x02\xa1\xa2\xb1\xb2,这将以正确的格式到达 在Python3中,我无法传递相同值的消息而不获得

我正在尝试发送一个需要以十六进制形式到达目的地的数据包,格式如下:
01 02 a1 a2 b1 b2

在Python2中,要发送的UDP方法是:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.send(message, (UDP_IP, UDP_Port))
消息可以传递一个十六进制字符串,如:
\x01\x02\xa1\xa2\xb1\xb2
,这将以正确的格式到达

在Python3中,我无法传递相同值的消息而不获得错误
str不支持缓冲区接口
。问题是,如果我传递消息bytestream
b'\x01\x02\xa1\xa2\xb1\xb2'
,它将不会以正确的格式到达

是否有人有任何建议(除port to 2.7外)


你需要对数据包进行编码。更改行:

post(packet)
致:


这对我很有效。

您应该直接发送
压缩的
,删除所有其他将字节转换为十六进制字符串的代码,然后尝试使用ByTestRing的Python表示的伪模拟将其转换回

了解字节与Python源代码中的十六进制表示形式之间的差异:

>>> import binascii
>>> b = binascii.unhexlify('0102') # hex string to bytes
>>> b
b'\x01\x02' # representation: repr(b)
>>> len(_)
2
>>> b'\\x01\\x02' #XXX it is not what you want
b'\\x01\\x02'
>>> len(_)
8
>>> repr(b)
"b'\\x01\\x02'" # repr of a repr
>>> repr(repr(b))
'"b\'\\\\x01\\\\x02\'"' # repr of a repr of a repr

你所说的“它不会以正确的格式到达”是什么意思?正确的格式如第一句所示。作为一个ByTestStream,它将以一种完全不同的值神奇地到达另一端(在Wireshark中)。查看发送的前5个字节(py3):
\x01\x00\x00\x00\x01
已接收
5c7830315c
我无法重现您的问题。Wireshark将“0102a1a2b1b2”报告为发送数据。你能发布一个说明问题的功能脚本吗。双重\\问题是,使用\\发送ByTestStream不起作用,但它也不能作为UTF-8工作:(我对您的规格有点困惑。您是否100%确定数据包实际上需要以
0102a1…
而不是
\x01\x02\xa1…
?您似乎把
\x00
\x
+
00
混淆了。)。
post(bytes(packet,"utf-8"))
>>> import binascii
>>> b = binascii.unhexlify('0102') # hex string to bytes
>>> b
b'\x01\x02' # representation: repr(b)
>>> len(_)
2
>>> b'\\x01\\x02' #XXX it is not what you want
b'\\x01\\x02'
>>> len(_)
8
>>> repr(b)
"b'\\x01\\x02'" # repr of a repr
>>> repr(repr(b))
'"b\'\\\\x01\\\\x02\'"' # repr of a repr of a repr