python pack函数的作用与使用方法

  • Post category:Python

Python中pack函数的作用与使用方法

作用

pack()函数是Python中内置的struct模块提供的函数,其主要作用是将Python中的各种数据类型(如整型、字符串、浮点数等)打包成指定格式的二进制数据,方便在网络传输时进行处理、传输。也可以将二进制流转换为不同类型的数据。

使用方法

pack()函数的语法格式如下:

struct.pack(fmt, v1, v2, ...)
  • fmt是指定格式的字符串,详细的格式化指令可以参考官方文档,例如:
fmt = '>20s6sif'

其中,’>’代表大端字节序,’20s’代表一个长度为20的字符串,’6s’代表长度为6的字符串,’i’代表一个整型数,’f’代表一个浮点型数。

  • v1,v2,... 为需要打包的数据,个数不限。

返回值为一个字节串(bytes类型)。

例如,下面这个例子将一个整数和一个字符串打包成’3s32s’格式的字节流:

import struct

fmt = '3s32s'
data = struct.pack(fmt, b'123', b'This is a string.')
print(data)

输出结果为:

b'123This is a string.              '

另一个例子将两个整数和一个浮点数打包成’iii10sf’格式的字节流:

import struct

fmt = 'iii10sf'
data = struct.pack(fmt, 111, 222, 333, b'abcdefghij', 3.14)
print(data)

输出结果为:

b'o\x00\x00\x00\xde\x00\x00\x00M\x01\x00\x00abcdefghij\xcd\xcc\x8c@'

这里 ‘\x00’ 表示的是 ASCII 编码中的空字符(NULL),出现是因为用“\x00”填充了字节串结尾的空余空间,以满足’10s’指令的要求。

注意事项

  • pack()打包时需要指定字节序列,常用的是 ‘!’ 代表 network(大端),‘<‘ 代表 little-endian,’>’ 代表 big-endian。
  • 传入的打包格式需要和传入的数据类型一一对应,否则会抛出 struct.error 异常。
  • 在打包中字符串的长度通常需要事先确定,并用例如 “10s” 的格式型来描述。
  • struct 与 bytes 都会有字符串类型的表示,要用 bytes,需要在打包的时候注意前面加上 b 前缀。
  • 打包后得到的数据为 bytes 类型,可以直接在无需转换的情况下传输给其他程序。
  • pack 允许使用 * 来描述变长的参数列表。

参考资料:
Python3 struct — Interpret strings as packed binary data