如何有效地将 int 存储为字节?
How to efficiently store an int into bytes?
我正在开发一个使用 python 3.7 套接字库发送和接收信息的程序,我希望它在网络方面高效(不需要那么快,我不需要没有足够的时间用 C) 构建它意味着如果我想发送数字 1024,我应该只需要 2 个字节。
在 C 中,所有需要做的就是将 int 转换为字符串,访问前 2 个字节,即(2 字节数字到 2 字节数组/"string")。
在 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
又名 uint16_t
(H
),采用 big-endian 格式 (>
) .这给出了两个字节 04 00
.
在实践中,struct
通常用于将大量数据打包在一起,使用更长的格式字符串:
data = struct.pack('>bbbbHHiid', dat1, dat2, dat3...)
您现在可能明白为什么该模块得名了!
如果真的只需要发单号,可以使用built-inint.to_bytes
方式:
>>> (1024).to_bytes(2, 'big')
b'\x04\x00'
第一个参数是要使用的字节数,第二个是字节顺序。
我正在开发一个使用 python 3.7 套接字库发送和接收信息的程序,我希望它在网络方面高效(不需要那么快,我不需要没有足够的时间用 C) 构建它意味着如果我想发送数字 1024,我应该只需要 2 个字节。
在 C 中,所有需要做的就是将 int 转换为字符串,访问前 2 个字节,即(2 字节数字到 2 字节数组/"string")。
在 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
又名 uint16_t
(H
),采用 big-endian 格式 (>
) .这给出了两个字节 04 00
.
在实践中,struct
通常用于将大量数据打包在一起,使用更长的格式字符串:
data = struct.pack('>bbbbHHiid', dat1, dat2, dat3...)
您现在可能明白为什么该模块得名了!
如果真的只需要发单号,可以使用built-inint.to_bytes
方式:
>>> (1024).to_bytes(2, 'big')
b'\x04\x00'
第一个参数是要使用的字节数,第二个是字节顺序。