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不支持缓冲区接口。问题是,如果我传递消息bytestreamb'\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