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)
c char 长度为 1 的字节串 1
b signed char 整数 1 (1), (2)
B unsigned char 整数 1 (2)
? _Bool bool 1 (1)
h short 整数 2 (2)
H unsigned short 整数 2 (2)
i int 整数 4 (2)
I unsigned int 整数 4 (2)
l long 整数 4 (2)
L unsigned long 整数 4 (2)
q long long 整数 8 (2)
Q unsigned long long 整数 8 (2)
n ssize_t 整数 (3)
N size_t 整数 (3)
e (6) float 2 (4)
f float float 4 (4)
d double float 8 (4)
s char[] 字节串 (9)
p char[] 字节串 (8)
P void* 整数 (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
本文总阅读量 次 本站总访问量 次 本站总访客数