为什么 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 字符和具有十六进制值的字符在字节字符串中是有效的。