当前位置:
首页 > Python基础教程 >
-
Python3标准库:zlib GNUzlib压缩(2)
lorem
print('Decompressed matches lorem:',decompressed_matches)
unused_matches = decompressor.unused_data == lorem
print('Unused data matches lorem:',unused_matches)
解压缩所有数据后,unused_data属性会包含未用的所有数据。
1.4 校验和
除了压缩和解压缩函数,zlib还包括两个用于计算数据的校验和的函数,分别是adler32()和crc32()。这两个函数计算出的校验和都不能认为是密码安全的,它们只用于数据完整性验证。
- import zlib
- data = open('lorem.txt','rb').read()
- cksum = zlib.adler32(data)
- print('Adler32: {:12d}'.format(cksum))
- print(' : {:12d}'.format(zlib.adler32(data,cksum)))
- cksum = zlib.crc32(data)
- print('CRC-32: {:12d}'.format(cksum))
- print(' : {:12d}'.format(zlib.crc32(data,cksum)))
这两个函数取相同的参数,包括一个包含数据的字节串和一个可选值,这个值可作为校验和的起点。这些函数会返回一个32位有符号整数值,这个值可以作为一个新的起点参数再传回给后续的调用,以生成一个动态变化的校验和。
1.5 压缩网络数据
下一个代码清单中的服务器使用流压缩器来响应文件名请求,它将文件的一个压缩版本写至与客户通信的套接字中。
- import zlib
- import logging
- import socketserver
- import binascii
- BLOCK_SIZE = 64
- class ZlibRequestHandler(socketserver.BaseRequestHandler):
- logger = logging.getLogger('Server')
- def handle(self):
- compressor = zlib.compressobj(1)
- # Find out what file the client wants
- filename = self.request.recv(1024).decode('utf-8')
- self.logger.debug('client asked for: %r', filename)
- # Send chunks of the file as they are compressed
- with open(filename, 'rb') as input:
- while True:
- block = input.read(BLOCK_SIZE)
- if not block:
- break
- self.logger.debug('RAW %r', block)
- compressed = compressor.compress(block)
- if compressed:
- self.logger.debug(
- 'SENDING %r',
- binascii.hexlify(compressed))
- self.request.send(compressed)
- else:
- self.logger.debug('BUFFERING')
- # Send any data being buffered by the compressor
- remaining = compressor.flush()
- while remaining:
- to_send = remaining[:BLOCK_SIZE]
- remaining = remaining[BLOCK_SIZE:]
- self.logger.debug('FLUSHING %r',
- binascii.hexlify(to_send))
- self.request.send(to_send)
- return
- if __name__ == '__main__':
- import socket
- import threading
- from io import BytesIO
- logging.basicConfig(
- level=logging.DEBUG,
- format='%(name)s: %(message)s',
- )
- logger = logging.getLogger('Client')
- # Set up a server, running in a separate thread
- address = ('localhost', 0) # let the kernel assign a port
- server = socketserver.TCPServer(address, ZlibRequestHandler)
- ip, port = server.server_address # what port was assigned?
- t = threading.Thread(target=server.serve_forever)
- t.setDaemon(True)
- t.start()
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式