首页 > 解决方案 > 如何有效地将 int 存储到字节中?

问题描述

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

标签: pythonpython-3.7

解决方案


如果要将数字打包成字节,则需要该struct模块。

>>> struct.pack('>H', 1024)
b'\x04\x00'

这会将数据以大端格式 ( ) 打包1024成一个unsigned shortaka uint16_t( )。这给出了两个字节。H>04 00

在实践中,struct通常用于将大量数据打包在一起,使用较长的格式字符串:

data = struct.pack('>bbbbHHiid', dat1, dat2, dat3...)

您现在可能明白为什么该模块得名了!

如果你真的只需要发送一个号码,你可以使用内置的int.to_bytes方法:

>>> (1024).to_bytes(2, 'big')
b'\x04\x00'

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


推荐阅读