使用 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_bytes
class的方法来解析一个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.
我在 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_bytes
class的方法来解析一个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.