python - 如何有效地将 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。
解决方案
如果要将数字打包成字节,则需要该struct
模块。
>>> struct.pack('>H', 1024)
b'\x04\x00'
这会将数据以大端格式 ( ) 打包1024
成一个unsigned short
aka uint16_t
( )。这给出了两个字节。H
>
04 00
在实践中,struct
通常用于将大量数据打包在一起,使用较长的格式字符串:
data = struct.pack('>bbbbHHiid', dat1, dat2, dat3...)
您现在可能明白为什么该模块得名了!
如果你真的只需要发送一个号码,你可以使用内置的int.to_bytes
方法:
>>> (1024).to_bytes(2, 'big')
b'\x04\x00'
第一个参数是要使用的字节数,第二个是字节序。
推荐阅读
- c++ - 素数索引位置c程序
- signalr - 如何维护服务器集线器可以调用的客户端方法列表?
- r - R中基于ID因子的子设置数据
- python - 散景中同时显示粗体和斜体文本
- python - fmin 为 arch 包中的相同优化例程提供了显着不同的答案
- wordpress - 当我在 htaccess 中配置 301 重定向时循环
- python - 带有ajax的Django Like函数
- c# - GenericTypeParameterBuilder 不支持 IsAssignableFrom
- arrays - 在 Swift 中处理大数组
- java - Java如何将可变参数传递给另一个函数,如 Paths.get()