使用 Python 套接字发送串联的固定长度值

Sending concatenated fixed-length values with Python sockets

我在 Python 中实现了一个简单的套接字,用于通过 UDP 发送整数值:

socket_client.sendto(str(value).encode('utf-8'), (UDP_IP, UDP_PORT))

现在我想用一个数据包发送两个不同的值,连接成一个 64 位长度的有效载荷。

问题是转换和编码的值没有固定长度,因此接收方无法确定如何拆分接收到的有效负载...

我的目标是发送一个 64 位长度的有效负载,以便能够分成两个不同的 32 位整数...这可能吗?

二进制编码

Python 整数有一个 built-in to_bytes 方法,可以方便地将整数序列化为给定长度的 bytes 对象。 您必须指定 byteorder 并需要决定整数是否可以为负数。

例如,这导致32位big-endian无符号表示(可以表示0..4294967295):

>>> x = 127
>>> b = x.to_bytes(4, 'big', signed=False)
>>> b
b'\x00\x00\x00\x7f'

您可以简单地连接其中两个以获得 64 位程序包。
注意:按原样发送 bytes 对象。不要给他们打电话str(...).encode()

在接收端,可以使用int.from_bytesclass的方法来解析一个4字节的字符串:

>>> int.from_bytes(b'\x00\x00\x00\x7f', 'big', signed=False)
127

十进制数字编码

您的 post 并不完全清楚。 您的代码段包含 str(value).encode('utf8'),这可能表明您打算发送使用 ASCII 数字编码的数字。 这也是可能的——只需用零或空格填充您的数字:

>>> '{:04d}'.format(127)
'0127'
>>> '{: 4d}'.format(127)
' 127'

在接收器上,用 int(...) 解析 4 字节字符串。 请注意,此表示仅允许范围 0..9999.