# struct-二进制数据处理

# 概述

struct模块是Python中用于处理二进制数据的模块。它提供了一组用于处理C语言风格的基本数据类型(如整型、浮点型、字符串等)的函数,能够实现二进制数据与Python数据类型之间的相互转换。

struct​模块中的函数主要有以下几个:

  • struct.pack(format, v1, v2, ...)​: 根据给定的格式format​将一组值打包成二进制数据,并返回一个包含打包数据的bytes对象。其中,format​是一个字符串,用于指定打包的数据类型及其顺序;v1, v2, ...​是要打包的数据值。
  • struct.unpack(format, buffer)​: 根据给定的格式format​从二进制数据中解包出一组数据,并返回一个包含解包数据的元组。其中,format​和buffer​分别表示解包的数据格式和数据源。
  • struct.calcsize(format)​: 根据给定的格式format​计算出打包后的二进制数据的大小(以字节为单位),并返回这个大小。

# format

# 类型

字符 C类型 Python类型 字节数
b signed char int 1
B unsigned char int 1
h short int 2
H unsigned short int 2
i int int 4
I unsigned int int 4
l long int 4
L unsigned long int 4
q long long int 8
Q unsigned long long int 8
f float float 4
d double float 8

# 格式

字符 格式
< 小端对齐
>
大端对齐

# 使用示例

# 1

import struct

# 将一组值打包成二进制数据
data = struct.pack('3s i f', b'abc', 100, 3.14)

# 解包出一组数据
values = struct.unpack('3s i f', data)

# 打印解包后的数据
print(values)  # 输出: (b'abc', 100, 3.140000104904175)

在上面的示例中,我们使用pack​函数将一个字符串、一个整数和一个浮点数打包成二进制数据,然后使用unpack​函数从这个二进制数据中解包出这三个值,并将它们打印出来。

'3s i f'​是pack​和unpack​中的格式字符串,表示打包和解包的数据类型及其顺序。3s​表示一个长度为3的字符串,i​表示一个整数,f​表示一个浮点数。

# 解析pyc文件元数据

def print_metadata(fp):
    magic = struct.unpack('<l', fp.read(4))[0]
    print(f"magic number = {hex(magic)}")
    bit_field = struct.unpack('<l', fp.read(4))[0]
    print(f"bit filed = {bit_field}")
    t = struct.unpack('<l', fp.read(4))[0]
    print(f"time = {time.asctime(time.localtime(t))}")
    file_size = struct.unpack('<l', fp.read(4))[0]
    print(f"file size = {file_size}")