struct 库实现 Python 字符串和二进制相互转化

发布时间: 更新时间: 总字数:620 阅读时间:2m 作者: IP上海 分享 网址

struct模块:解决str和其他二进制数据类型的转换

介绍

struct 的相关函数

  • exception struct.error 异常
  • struct.pack(format, v1, v2, ...) 返回一个 bytes 对象
    • 根据格式字符串 format 打包值 v1, v2, ...
    • 参数个数必须与格式字符串所要求的值完全匹配
  • struct.pack_into(format, buffer, offset, v1, v2, ...)
    • 根据格式字符串 format 打包 v1, v2, ... 等值
    • 将打包的字节串写入可写缓冲区 bufferoffset 开始的位置,offset 是必需的参数
  • struct.unpack(format, buffer)
    • 根据格式字符串 format 从缓冲区 buffer 解包(假定是由 pack(format, …) 打包)
    • 结果为一个元组,即使其只包含一个条目
    • 缓冲区的字节大小必须匹配格式所要求的大小,如 calcsize() 所示
  • struct.unpack_from(format, /, buffer, offset=0)
    • 对 buffer 从位置 offset 开始根据格式字符串 format 进行解包
    • 结果为一个元组,即使其中只包含一个条目
    • 缓冲区的字节大小从位置 offset 开始必须至少为 calcsize() 显示的格式所要求的大小
  • struct.iter_unpack(format, buffer)
  • struct.calcsize(format)
    • 返回与格式字符串 format 相对应的结构的大小(即 pack(format, ...) 所产生的字节串对象的大小)

字节顺序

格式字符

格式C 类型Python 类型标准大小备注
x填充字节(7)
cchar长度为 1 的字节串1
bsigned char整数1(1), (2)
Bunsigned char整数1(2)
?_Boolbool1(1)
hshort整数2(2)
Hunsigned short整数2(2)
iint整数4(2)
Iunsigned int整数4(2)
llong整数4(2)
Lunsigned long整数4(2)
qlong long整数8(2)
Qunsigned long long整数8(2)
nssize_t整数(3)
Nsize_t整数(3)
e(6)float2(4)
ffloatfloat4(4)
ddoublefloat8(4)
schar[]字节串(9)
pchar[]字节串(8)
Pvoid*整数(5)

示例

  • 简单示例
import struct
num1 = 12345
num2 = 123
num3 = 1

# 把任意长度的整数转换成4个字节:2**32次方
l1 = struct.pack('i', num1)
l2 = struct.pack('i', num2)
l3 = struct.pack('i', num3)

print(len(l1), l1)  # 4 b'90\x00\x00'
print(len(l2), l2)  # 4 b'{\x00\x00\x00'
print(len(l3), l3)  # 4 b'\x01\x00\x00\x00'

unum1 = struct.unpack('i', l1)
unum2 = struct.unpack('i', l2)
unum3 = struct.unpack('i', l3)

# 返回元组,要取第0个元素
print(unum1[0])  # 12345
print(unum2[0])  # 123
print(unum3[0])  # 1
  • 格式化
from struct import *
pack(">bhl", 1, 2, 3)  # b'\x01\x00\x02\x00\x00\x00\x03'
unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03')  # (1, 2, 3)
calcsize('>bhl')     # 7
pack("@3s", b'123')  # b'123'
pack("@ccc", b'1', b'2', b'3')  # b'123'

参考

  1. https://docs.python.org/zh-cn/3/library/struct.html
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数