我正在开发一个使用python 3.7套接字库发送和接收信息的程序,并且我希望它在网络方面是高效的(不需要那么快,我没有足够的时间来构建在C中表示),如果我要发送数字1024,则只需2个字节。
在C语言中,所有需要完成的工作都是将int转换为字符串,访问前2个字节,即(将2个字节编号转换为2个字节的数组/“字符串”)。
在Python中,即使使用字节结构,我也总是以b'(\ x8a'之类的东西结束,它远大于所需的字节数。
socket.send函数仅接受字节对象,因此我尝试这样解析int(to_bytes和from_bytes),但最终得到的字节数(b'(\ x8a')比我使用的还要大str()
当我为1024这样的数字将接收缓冲区设置为2个字节时,我想接收1024而不是10。
答案 0 :(得分:1)
如果要将数字打包成字节,则需要struct
模块。
>>> struct.pack('>H', 1024)
b'\x04\x00'
这会将数据1024
打包成大端字节格式(unsigned short
)的单个uint16_t
也称为H
(>
)。这给出了两个字节04 00
。
实际上,struct
通常用于使用较长的格式字符串将大量数据打包在一起:
data = struct.pack('>bbbbHHiid', dat1, dat2, dat3...)
您现在可能已经知道了为什么该模块获得名称了!
如果您真的只需要发送一个号码,则可以使用内置的int.to_bytes
方法:
>>> (1024).to_bytes(2, 'big')
b'\x04\x00'
第一个参数是要使用的字节数,第二个参数是字节序。