第 18 章 二进制数据 二进制数据
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
任何足够清晰的问题都可以用一个二进制数字来回答-0 或 1,是或否。
卡尔-萨根
文本数据可能很有挑战性,但二进制数据也可能很有趣。您需要了解一些概念 ,如字节序(计算机处理器将数据分解成字节的方式)和整数的符号位。您可能需要深入研究二进制文件格式或网络数据包,以提取甚至更改数据。 本节将向您展示在 Python 中处理二进制数据的基础知识。您将在第 20 章中看到如何读写二进制文件。
用结构体转换二进制数据
正如您所看到的,Python 有许多处理文本的工具。处理二进制数据的工具要少得多。 标准库包含struct 模块,它处理的数据类似于 C 和 C++ 中的结构体。使用struct ,您可以将二进制数据转换为 Python 数据结构,也可以将二进制数据转换为 Python 数据结构。
我们将编写一个小程序,从一些 PNG 数据中提取图像的宽度和高度。
我们将使用 O'Reilly 的徽标,即图 18-1 中所示的小虫子眼睛的 Tarsier。
图 18-1. O'Reilly tarsier
这张图片的 PNG 文件可以在维基百科上找到。 我在第 20 章才介绍如何读取文件,所以我下载了这个文件,写了一个小程序将其值打印为字节,并将前 30 个字节的值输入一个名为data 的 Pythonbytes 变量,用于下面的示例。(PNG 格式规范规定,宽度和高度存储在前 24 个字节中,所以我们现在不需要更多的字节)。
代码如下:
>>>importstruct>>>valid_png_header=b'\x89PNG\r\n\x1a\n'>>>data=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR'+\...b'\x00\x00\x00\x9a\x00\x00\x00\x8d\x08\x02\x00\x00\x00\xc0'>>>ifdata[:8]==valid_png_header:...width,height=struct.unpack('>LL',data[16:24])...('Valid PNG, width',width,'height',height)...else:...('Not a valid PNG')...Valid PNG, width 154 height 141
下面是这段代码的作用:
-
data包含 PNG 文件的前 30 个字节。为使其适合在页面上显示,我用+和延续字符 (\) 连接了两个字节串。 -
valid_png_header包含标志着有效 PNG 文件开始的 8 个字节序列。 -
width从 16-19 字节中提取,height从 20-23 字节中提取。
>LL 是格式字符串,它指示unpack() 如何解释输入的字节序列并将其组合成 Python 数据类型。下面是详细说明:
-
>表示整数以大端格式存储。 -
每个
L指定一个四字节无符号长整数。
您可以直接检查每个四字节值:
>>> Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access