为什么 socket.recv() 在 python3 return 值上丢失了最后一个字节?
why socket.recv() on python3 return value that lost the last byte?
所以我有 python 这样的代码来向端口发送和接收 UDP 数据包
s = socket(AF_INET, SOCK_DGRAM)
UDP_IP = '1.0.0.45'
UDP_PORT = 8100
s.connect((UDP_IP, UDP_PORT))
r = s.send(ethernet_packet + payload)
data = s.recv(1024)
print(data)
数据包发送成功,在tcpdump
,我收到的udp数据包是
但是收到的数据是这样打印的:b'\xff\xff\xff\xff\xff\xff\x00\x01\x00\x00\x00\x08\x80\x04\xc0\x00\x00\x00\x009'
最后一个字节应该是“x39”,由于某种原因缺少 3,有人知道为什么吗?
感谢 adv
这是预期的行为。如果 python 可以将字节对象中的一个字节表示为 ASCII,它会的。 b'9' 只是 b'\x39',但 python 更喜欢 ASCII 以提高可读性。
>>> b"\x39"
b'9'
string literals 的 Python 文档表明 ASCII 字符和具有十六进制值的字符在字节字符串中是有效的。
所以我有 python 这样的代码来向端口发送和接收 UDP 数据包
s = socket(AF_INET, SOCK_DGRAM)
UDP_IP = '1.0.0.45'
UDP_PORT = 8100
s.connect((UDP_IP, UDP_PORT))
r = s.send(ethernet_packet + payload)
data = s.recv(1024)
print(data)
数据包发送成功,在tcpdump
,我收到的udp数据包是
但是收到的数据是这样打印的:b'\xff\xff\xff\xff\xff\xff\x00\x01\x00\x00\x00\x08\x80\x04\xc0\x00\x00\x00\x009'
最后一个字节应该是“x39”,由于某种原因缺少 3,有人知道为什么吗?
感谢 adv
这是预期的行为。如果 python 可以将字节对象中的一个字节表示为 ASCII,它会的。 b'9' 只是 b'\x39',但 python 更喜欢 ASCII 以提高可读性。
>>> b"\x39"
b'9'
string literals 的 Python 文档表明 ASCII 字符和具有十六进制值的字符在字节字符串中是有效的。