【雕爷学编程】MicroPython手册之内置模块 uzlib-压缩算法模块

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

MicroPython的内置模块uzlib是一个用于处理zlib压缩算法的模块,它实现了CPython模块的一个子集,但也有一些特殊的特点和限制。本文将从以下几个方面介绍uzlib模块的主要特点、应用场景,以及需注意事项,并给出几个实际运用程序案例。

主要特点

1、uzlib模块提供了一个decompress函数,用于对使用DEFLATE算法(常用于zlib库和gzip归档程序)压缩的二进制数据进行解压缩。尚未实现压缩功能。
2、uzlib模块还提供了一个DecompIO类,用于创建一个流包装器,它允许对另一个流中的压缩数据进行透明解压缩。这允许处理数据大于可用堆大小的压缩流。
3、uzlib模块使用的zlib压缩算法是CPython zlib模块的一个子集,也是POSIX标准zlib压缩算法的一个子集。支持的参数和方法有:wbits、4、bufsize、read、write、close、readable、writable、seekable等。不支持的有:hexlif、digest、hexdigest等。

应用场景

1、uzlib模块可以用于对数据进行解压缩,例如从网络或文件中读取使用zlib或gzip格式压缩的数据,或者向网络或文件中写入解压缩后的数据。
2、uzlib模块可以用于节省存储空间或传输带宽,例如将一些不常用或重复的数据使用zlib或gzip工具进行压缩后存储或发送,然后在需要时使用uzlib模块进行解压缩。
3、uzlib模块可以用于处理一些使用zlib或gzip格式压缩的标准文件或协议,例如PNG图片文件、HTTP协议等。

需注意事项

1、uzlib模块的功能和性能可能因不同的端口而异,因此在开发可移植的MicroPython应用程序时,应该尽量避免依赖特定的zlib压缩算法语法或结果。
2、uzlib模块在编译和执行zlib压缩算法时可能会消耗较多的内存和时间,因此在处理大量或复杂的数据时,应该注意优化代码和资源管理。
3、uzlib模块在编译和执行zlib压缩算法时可能会遇到无效或不合法的数据或参数,或者内存错误、性能错误等异常情况。这些情况会引发OSError或ValueError异常,并给出错误信息。应该使用try-except语句来捕获并处理这些异常。

实际运用程序案例

案例一:使用uzlib模块从网络中读取并解压缩一个gzip文件

import network
import urequests
import uio
import uzlib

# 连接到WiFi网络
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('SSID', 'PASSWORD')
while not sta_if.isconnected():
    pass

# 从网络中读取一个gzip文件
url = 'http://example.com/file.txt.gz'
response = urequests.get(url)
data = response.content
response.close()

# 使用uio.BytesIO类创建一个二进制流对象
b = uio.BytesIO(data)

# 使用uzlib.DecompIO类创建一个解压缩流对象,wbits=31表示自动检测gzip格式
d = uzlib.DecompIO(b, wbits=31)

# 使用uio.DecompIO类的read方法读取解压缩后的数据,并打印出来
text = d.read()
print('解压缩后的数据:', text)

案例二:使用uzlib模块将一个文本文件压缩为gzip格式并保存到文件中

import uio
import uzlib
import ubinascii

# 定义一个文本文件的内容
text = 'Hello, world!'

# 使用uio.StringIO类创建一个文本流对象
s = uio.StringIO(text)

# 使用uzlib.DecompIO类创建一个压缩流对象,wbits=31表示使用gzip格式
c = uzlib.DecompIO(s, wbits=31)

# 使用uio.DecompIO类的read方法读取压缩后的数据,并转换为十六进制格式
data = c.read()
hex_data = ubinascii.hexlify(data).decode()
print('压缩后的数据:', hex_data)

# 将压缩后的数据写入文件中
with open('file.txt.gz', 'wb') as f:
    f.write(data)

案例三:使用uzlib模块解析一个PNG图片文件的元数据

import uio
import uzlib

# 定义一个PNG图片文件的二进制数据
data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5cO\xa5a\x00\x00 \x00IDATx^\xed\xd4yT\\\xd7}\xe0\xf1{\x8f\xe3\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xf8\xe1\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9\xb9y\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3\xd3y\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffy\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0y\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80'

# 使用uio.BytesIO类创建一个二进制流对象
b = uio.BytesIO(data)

# 读取PNG文件的签名,应该是b'\x89PNG\r\n\x1a\n'
signature = b.read(8)
print('签名:', signature)

# 读取PNG文件的第一个块的长度,应该是13字节
length = int.from_bytes(b.read(4), 'big')
print('长度:', length)

# 读取PNG文件的第一个块的类型,应该是b'IHDR'
type = b.read(4)
print('类型:', type)

# 读取PNG文件的第一个块的数据,使用uzlib.decompress函数解压缩,得到图片的宽度、高度、位深、颜色类型等信息
data = b.read(length)
info = uzlib.decompress(data, wbits=15)
width = int.from_bytes(info[0:4], 'big')
height = int.from_bytes(info[4:8], 'big')
bit_depth = info[8]
color_type = info[9]
print('宽度:', width)
print('高度:', height)
print('位深:', bit_depth)
print('颜色类型:', color_type)

案例四:压缩并保存数据

import uzlib
import uos

data = uos.urandom(1024) 

compressed = uzlib.compress(data)

with open('data.zip', 'wb') as f:
  f.write(compressed)

案例五::解压缩数据

import uzlib

with open('data.zip', 'rb') as f:
  compressed = f.read()

data = uzlib.decompress(compressed)
print(data)

案例六:压缩传感器数据上传

import urequests
import uzlib

url = 'http://api.example.com/data'

sensor_data = get_sensor_data() 

compressed = uzlib.compress(sensor_data)

urequests.post(url, compressed)  

这些案例展示了如何在MicroPython中用uzlib模块进行数据压缩和解压缩,可以减小传输和存储空间。uzlib提供了zlib算法的 subset实现。

案例七:压缩数据

import uzlib

# 要压缩的数据
data = b"Hello, MicroPython!"

# 创建压缩对象
compressor = uzlib.Compressor()

# 压缩数据
compressed_data = compressor.compress(data)
compressed_data += compressor.flush()

# 打印压缩后的数据
print("压缩后的数据:", compressed_data)

在这个例子中,我们首先创建了一个压缩对象 compressor。然后,我们使用 compress() 方法将要压缩的数据 data 传递给压缩对象进行压缩。最后,我们使用 flush() 方法获取压缩后的数据,并打印出来。

案例八:解压缩数据

import uzlib

# 压缩的数据
compressed_data = b"\x78\x9c\xcb\x48\xcd\xc9\xc9\x57\x08\xcf\x2f\xca\x49\x01\x00\x0d\x07"

# 创建解压缩对象
decompressor = uzlib.Decompressor()

# 解压缩数据
decompressed_data = decompressor.decompress(compressed_data)

# 打印解压缩后的数据
print("解压缩后的数据:", decompressed_data)

在这个例子中,我们有一个压缩的数据 compressed_data。我们首先创建了一个解压缩对象 decompressor。然后,我们使用 decompress() 方法将压缩的数据传递给解压缩对象进行解压缩。最后,我们打印解压缩后的数据。

案例九: 压缩文件

import uzlib

# 要压缩的文件
filename = "data.txt"

# 创建压缩对象
compressor = uzlib.Compressor()

# 打开文件进行读取
with open(filename, "rb") as file:
    data = file.read()

    # 压缩数据
    compressed_data = compressor.compress(data)
    compressed_data += compressor.flush()

# 将压缩后的数据写入文件
compressed_filename = "compressed_data.bin"
with open(compressed_filename, "wb") as compressed_file:
    compressed_file.write(compressed_data)

print("文件压缩完成。")

在这个例子中,我们首先创建了一个压缩对象 compressor。然后,我们使用 open() 函数打开要压缩的文件 filename 进行读取。我们将文件数据传递给压缩对象进行压缩,并使用 flush() 方法获取压缩后的数据。最后,我们将压缩后的数据写入一个新的文件 compressed_filename 中。

这些示例展示了使用 uzlib 模块压缩和解压缩数据的实际应用。请注意,在使用 uzlib 模块之前,你需要导入它。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值