【发布时间】:2015-11-25 00:49:53
【问题描述】:
我正在 python 中的 UDP 之上的应用程序空间中创建一个网络协议,用于家庭作业。我需要将源端口和目标端口表示为 16 位数字。所有尝试都失败了。
我对此进行测试的方法是创建一个 udp 套接字并查看 sendto() 的返回值。这是您的典型套接字代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ("127.0.0.1", 1234)
端口范围从 0 到 65535。假设我选择 65000 端口。我希望 sendto() 返回 2(2 字节 = 发送 16 位)。这是我尝试过的:
我调用以下命令并得到:
>>>mySock.sendto(655000, addr)
TypeError: must be string or buffer, not int
好的,我们试试bytes()
>>>mySock.sendto(bytes(65000), addr)
5
嗯,这不是我想要的。就是把每个数字变成一个单字节的字符。
如果我按位或使用 0x0000 怎么办?
>>>mySock.sendto(bytes(65000 | 0x0000), addr)
5
好吧,该死的!我最接近的事情是搞乱hex() 和bytearray()。见下文。
>>>hex(65000)
'0xfde8'
>>>mySock.sendto('\xfde8', addr)
3
不应该说 2 个字节吗?我不确定这是如何工作的。此外,当数字小于 16384 时,我想保留前面的 0。因此,例如,如果端口号是 255 (0b0000000011111111),我希望它保留为 2 字节数据结构 (0x00FF),而不是截断为 0xFF 或 0b11111111。
【问题讨论】:
-
len('\xfde8')是 3,因为那里有 3 个字符:('\xfd', 'e', '8')
标签: python sockets byte port sendto