1. struct二进制数据结构

struct模块包括一些函数,这些函数可以完成字节串与原生Python数据类型(如数字和字符串)之间的转换。

1.1 函数与Struct类

struct提供了一组处理结构值的模块级函数,另外还有一个Struct类。格式指示符将由字符串格式转换为一种编译表示,这与处理正则表达式的方式类似。这个转换会耗费一些资源,所以创建一个Struct实例并在这个实例上调用方法时(不是使用模块级函数)只完成一次转换,这会更高效。下面的例子使用了Struct类。

1.2 打包和解包

Struct支持使用格式指示符将数据打包(packing)为字符串,另外支持从字符串解包(unpacking)数据,格式指示符由表示数据类型的字符和可选的数量及字节序(endianness)指示符构成。

在下面的例子中,指示符要求有一个整型或长整型值、一个两字节字符串以及一个浮点数。格式指示符中包含的空格用来分隔类型指示符,并且在编译格式时会被忽略。

  1. import struct
  2. import binascii
  3.  
  4. values = (1, 'ab'.encode('utf-8'), 2.7)
  5. s = struct.Struct('I 2s f')
  6. packed_data = s.pack(*values)
  7.  
  8. print('Original values:', values)
  9. print('Format string :', s.format)
  10. print('Uses :', s.size, 'bytes')
  11. print('Packed Value :', binascii.hexlify(packed_data))

这个例子将打包的值转换为一个十六进制字节序列,以便用binascii.hexlify()打印,因为有些字符是null。

使用unpack()可以从打包的表示中抽取数据。

  1. import struct
  2. import binascii
  3.  
  4. packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40')
  5.  
  6. s = struct.Struct('I 2s f')
  7. unpacked_data = s.unpack(packed_data)
  8. print('Unpacked Values:', unpacked_data)

将打包值传入unpack(),基本上会得到相同的值(注意浮点值中的微小差别)。

1.3 字符串

默认地,值会使用原生C库的字节序(endianness)来编码。只需在格式串中提供一个显式的字节序指令,就可以很容易地覆盖这个默认选择。

  1. import struct
  2. import binascii
  3.  
  4. values = (1, 'ab'.encode('utf-8'), 2.7)
  5. print('Original values:', values)
  6.  
  7. endianness = [
  8. ('@', 'native, native'),
  9. ('=', 'native, standard'),
  10. ('<', 'little-endian'),
  11. ('>', 'big-endian'),
  12. ('!', 'network'),
  13. ]
  14.  
  15. for code, name in endianness:
  16. s = struct.Struct(code + ' I 2s f')
  17. packed_data = s.pack(*values)
  18. print()
  19. print('Format string :', s.format, 'for', name)
  20. print('Uses :', s.size, 'bytes')
  21. print('Packed Value :', binascii.hexlify(packed_data))
  22. print('Unpacked Value :', s.unpack(packed_data))

根据下表,格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:

字符

字节顺序

大小

对齐方式

@

按原字节

按原字节

按原字节

=

按原字节

标准

<

小端

标准

>

大端

标准

!

网络(=大端)

标准

1.4 缓冲区

通常在强调性能的情况下或者向扩展模块传入或传出数据时才会处理二进制打包数据。通过避免为每个打包结构分配一个新缓冲区所带来的开销,这些情况可以得到优化。pack_into()和unpack_from()方法支持直接写入预分配的缓冲区。

  1. import array
  2. import binascii
  3. import ctypes
  4. import struct
  5.  
  6. s = struct.Struct('I 2s f')
  7. values = (1, 'ab'.encode('utf-8'), 2.7)
  8. print('Original:', values)
  9.  
  10. print()
  11. print('ctypes string buffer')
  12.  
  13. b = ctypes.create_string_buffer(s.size)
  14. print('Before :', binascii.hexlify(b.raw))
  15. s.pack_into(b, 0, *values)
  16. print('After :', binascii.hexlify(b.raw))
  17. print('Unpacked:', s.unpack_from(b, 0))
  18.  
  19. print()
  20. print('array')
  21.  
  22. a = array.array('b', b'\0' * s.size)
  23. print('Before :', binascii.hexlify(a))
  24. s.pack_into(a, 0, *values)
  25. print('After :', binascii.hexlify(a))
  26. print('Unpacked:', s.unpack_from(a, 0))

Struct的size属性指出缓冲区需要有多大。

Python3标准库:struct二进制数据结构的更多相关文章

  1. 8.Python3标准库--数据持久存储与交换

    ''' 持久存储数据以便长期使用包括两个方面:在对象的内存中表示和存储格式之间来回转换数据,以及处理转换后数据的存储区. 标准库包含很多模块可以处理不同情况下的这两个方面 有两个模块可以将对象转换为一 ...

  2. Python3 标准库

    Python3标准库 更详尽:http://blog.csdn.net/jurbo/article/details/52334345 文本 string:通用字符串操作 re:正则表达式操作 diff ...

  3. 7.Python3标准库--文件系统

    ''' Python的标准库中包含大量工具,可以处理文件系统中的文件,构造和解析文件名,还可以检查文件内容. 处理文件的第一步是要确定处理的文件的名字.Python将文件名表示为简单的字符串,另外还提 ...

  4. 1.Python3标准库--前戏

    Python有一个很大的优势便是在于其拥有丰富的第三方库,可以解决很多很多问题.其实Python的标准库也是非常丰富的,今后我将介绍一下Python的标准库. 这个教程使用的书籍就叫做<Pyth ...

  5. python023 Python3 标准库概览

    Python3 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. >>> import os >>> os.getcwd() # 返回当前的工作 ...

  6. 比较两个文件的异同Python3 标准库difflib 实现

    比较两个文件的异同Python3 标准库difflib 实现 对于要比较两个文件特别是配置文件的差异,这种需求很常见,如果用眼睛看,真是眼睛疼. 可以使用linux命令行工具diff a_file b ...

  7. python3标准库总结

    Python3标准库 操作系统接口 os模块提供了不少与操作系统相关联的函数. ? 1 2 3 4 5 6 >>> import os >>> os.getcwd( ...

  8. 3.Python3标准库--数据结构

    (一)enum:枚举类型 import enum ''' enum模块定义了一个提供迭代和比较功能的枚举类型.可以用这个为值创建明确定义的符号,而不是使用字面量整数或字符串 ''' 1.创建枚举 im ...

  9. 9.Python3标准库--数据压缩与归档

    ''' 尽管现代计算机系统的存储能力日益增长,但生成数据的增长是永无休止的. 无损(lossless)压缩算法以压缩或解压缩数据花费的时间来换取存储数据所需要的空间,以弥补存储能力的不足. Pytho ...

随机推荐

  1. Jconsole或者VisualVM监控远程主机(阿里云,jdk11或者8)

    准备: 1 一个war包或者jar包,这里我用springboot的 2 linux环境,安装tomcat,jdk,我用的jdk11和tomcat9,jdk11和8的拷贝权限文件路径有点不一样,这个需 ...

  2. artTemplate--模板使用自定义函数(1)

    案例 因为公司业务需要频繁调用接口,后端返回的都是json树对象,需要有些特殊的方法做大量判断和数据处理,显然目前简单语法已经不能满足业务需要了,需要自己定制一些 方法来处理业务逻辑. 例如后台返回的 ...

  3. 关于Influxdb1.4.2在windows下的安装过程的一些问题的记录

    一.安装与配置: 1. Influxdb在1.3以后版本已经关闭了内置 的8086的web管理功能,需要单独的工具来管理 2.其配置文件默认路径是linux格式,需要修改为本机windows格式 我的 ...

  4. 形象解释各种卷积算法(Convolution animations)

    No padding, no strides Arbitrary padding, no strides Half padding, no strides Full padding, no strid ...

  5. 关于求最长子串,使得最大减最小小于k的问题-以POJ4003为例

    问题 给出一个长度为\(n\)的序列\(a[i]\),有\(m\)次询问, 每次给你一个\(k\),让你求一个最长子串\([l,r]\),使得\(max_l^r\{a_i\}-min_l^r\{a_i ...

  6. Comet OJ Contest #0 解方程(暴力)

    题意: 给定自然数n,求满足$\displaystyle \sqrt{x-\sqrt{n}}=\sqrt{z}-\sqrt{y}$的x,y,z,输出解的个数以及所有解 xyz的和 n<=1e9, ...

  7. git命令清单 摘自 阮老师

    常用 Git 命令清单   作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60- ...

  8. 【python-leetcode713-双指针】乘积小于k的子数组

    问题描述: 给定一个正整数数组 nums. 找出该数组内乘积小于 k 的连续的子数组的个数. 示例 1: 输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于10 ...

  9. 申请Let’s Encrypt通配符HTTPS证书(certbot ACME v2版)

    1.获取certbot-auto# 下载 # 下载 wget https://dl.eff.org/certbot-auto # 设为可执行权限 chmod a+x certbot-auto 2.开始 ...

  10. 使用github--stanfordnlp--glove训练自己的数据词向量

    1.准备语料 准备好自己的语料,保存为txt,每行一个句子或一段话,注意要分好词.将分好词的语料保存为×××.txt 2.准备源码 下载地址:https://github.com/stanfordnl ...