【Python 模块】——struct

发布于:2024-11-28 ⋅ 阅读:(10) ⋅ 点赞:(0)

0. 背景

业务上有时候需要将int/float这类可读性高的数据与二进制bytes字符串相互转换,有时是小端,有时是大端

1. 大端小端的区别

二进制数据在存储时,有大端字节序和小端字节序的区别,

小端字节序:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中
大端字节序:数据的高位保存在内存的低地址中,数据的低位保存在内存的高地址中

举例说明:

例如:0x12345678,地址从左到右依次是0x00 0x01 0x02 0x03
小端存储为:0x78 0x56 0x34 0x12
大端存储为:0x12 0x34 0x56 0x78

2. 使用struct模块

官网链接:https://docs.python.org/zh-cn/3/library/struct.html

python 提供了标准模块struct,可以实现int/float/double/bool/char类型数据与二进制bytes字符串的相互转换。struct支持的格式字符如下:
格式字符
注:格式字符的第一个字符用于指示打包数据的字节顺序,大小和对齐方式
首字符说明

2.1 pack方法将可读性较高的数据转换成二进制bytes类型

示例一:将1023转换成2个byte长度小端类型的二进制数据,1023=0x03ff,结果应该是b"\xff\x03",代码如下:

import struct

data = struct.pack("<h", 1023)
print(data)

<表示转换成小端,h表示制定转换类型为short
最终结果为:

b'\xff\x03'

示例二:将56.7转换成4个byte长度小端类型的二进制数据,代码如下:

import struct

data = struct.pack("<f", 56.7)
print(data)

# 结果
# b'\xcd\xccbB'

2.2 unpack方法将二进制bytes类型转换成制定类型可读性较高的数据

示例一:将b"\xff\x03"转换成short类型,代码如下:

import struct

data = struct.unpack("<h", b'\xff\x03')[0]
print(data)

<表示转换成小端,h表示制定转换类型为short
最终结果为:

1023

示例二:将b’\xcd\xccbB’转换成float类型,代码如下:

import struct

data = struct.unpack("<f", b'\xcd\xccbB')[0]
print(data)

# 结果
# 56.70000076293945 # 浮点数不精确