我正在使用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。
答案 0 :(得分:0)
如果要发送二进制数据,请使用模块struct
。这将帮助您对字符串进行编码并确保使用正确的字节序。例如:
>>> import struct
>>> struct.pack('!H', 65000)
'\xfd\xe8'
这是65000作为无符号短片,按网络顺序(大端)