Python的struct

struct 是 Python 中的一个内建模块,用于处理 C 语言结构体与 Python 数据类型之间的转换。它允许你将 Python 中的数据打包成二进制格式,或者将二进制数据解包成 Python 数据类型。这在处理二进制数据(如网络通信、文件读写等)时非常有用。

基本用法

打包(Packing)

使用 struct.pack 方法将 Python 数据类型转换为二进制数据。struct.pack 的第一个参数是一个格式字符串,用于指定要打包的数据的类型和顺序;后面的参数是要打包的数据。

格式字符串由多个字符组成,每个字符表示一个数据类型。例如:

  • c:字符(1 字节)
  • b:有符号字符(1 字节)
  • B:无符号字符(1 字节)
  • h:短整型(2 字节)
  • H:无符号短整型(2 字节)
  • i:整型(4 字节)
  • I:无符号整型(4 字节)
  • f:浮点型(4 字节)
  • d:双精度浮点型(8 字节)

还有一些用于指定字节顺序和字节大小的修饰符,如:

  • @:原生字节顺序(默认)
  • =:标准字节顺序(默认)
  • <:小端字节顺序(最低有效字节在前)
  • >:大端字节顺序(最高有效字节在前)
  • !:网络字节顺序(大端)
  • s:字符串(前面必须指定长度)
  • p:指针(用于内部表示)
  • x:填充字节(不占用任何存储空间)

示例:

 

python复制代码

  import struct
   
  # 将两个整数打包成二进制数据
  packed_data = struct.pack('ii', 1, 2)
  print(packed_data) # 输出:b'\x01\x00\x00\x00\x02\x00\x00\x00'

解包(Unpacking)

使用 struct.unpack 方法将二进制数据解包成 Python 数据类型。struct.unpack 的第一个参数是格式字符串,后面是要解包的二进制数据(通常是字节对象)。

示例:

 

python复制代码

  import struct
   
  # 之前打包的二进制数据
  packed_data = b'\x01\x00\x00\x00\x02\x00\x00\x00'
   
  # 解包二进制数据
  unpacked_data = struct.unpack('ii', packed_data)
  print(unpacked_data) # 输出:(1, 2)

计算大小(Calculating Size)

使用 struct.calcsize 方法可以计算格式字符串指定的数据在内存中的大小(以字节为单位)。

示例:

 

python复制代码

  import struct
   
  # 计算两个整型数据在内存中的大小
  size = struct.calcsize('ii')
  print(size) # 输出:8

示例应用

假设你有一个包含多个整数和浮点数的二进制文件,你可以使用 struct 模块来读取和写入这个文件。

写入二进制文件

 

python复制代码

  import struct
   
  # 要写入的数据
  data = [(1, 2.5), (3, 4.5), (5, 6.5)]
   
  # 打开文件用于二进制写入
  with open('data.bin', 'wb') as f:
  for item in data:
  # 打包数据并写入文件
  packed_item = struct.pack('if', *item)
  f.write(packed_item)

读取二进制文件

 

python复制代码

  import struct
   
  # 打开文件用于二进制读取
  with open('data.bin', 'rb') as f:
  # 计算每条记录的大小
  record_size = struct.calcsize('if')
   
  # 读取文件中的所有记录
  data = []
  while True:
  # 从文件中读取一条记录
  record = f.read(record_size)
  if not record:
  break
  # 解包记录并添加到列表中
  unpacked_record = struct.unpack('if', record)
  data.append(unpacked_record)
   
  print(data) # 输出:[(1, 2.5), (3, 4.5), (5, 6.5)]

struct 模块非常强大,适用于各种需要处理二进制数据的场景。通过掌握它的用法,你可以更有效地处理网络通信

你可能感兴趣的:(python)