如何有效地将int转换为字节?

时间:2019-06-27 22:13:31

标签: python python-3.7

我正在开发一个使用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。

1 个答案:

答案 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'

第一个参数是要使用的字节数,第二个参数是字节序。