
基于@ohos.zlib的数据压缩与解压缩
场景描述
1.基于Zip实现ArrayBuffer类型数据的压缩与解压缩操作:应用开发过程中客户端应用与服务端频繁通信,当消息体积过大时,可以对数据流进行压缩操作,并对收发消息做CRC校验。
2.基于Gzip的数据的压缩与解压缩:将日志压缩写入gz文件;解压gz格式html、JSON、图片等各类资源文件。
方案描述
场景一、通信过程中的数据压缩、解压缩与校验
1.效果图
2.方案
1)通过getRawFileContentSync读取rawfile下文件存在arrayBufferIn中;
2)使用zip.compress将源缓冲区arrayBufferIn压缩至目标缓冲区arrayBufferOut;
3)使用socket.constructTCPSocketServerInstance创建TCPSocketServer连接,调用listen绑定IP地址和端口实现监听,通过tcpServer.on\('connect'\)订阅连接,同时订阅TCPSocketConnection连接的接收消息事件,当收到用户端发送的数据后,先用adler32计算Adler-32校验和对传输数据进行校验,再调用zip.uncompress实现数据的解压缩,并将解压缩后的数据通过fs.write写入文件。
4)使用socket.constructTCPSocketInstance创建TCPSocket连接,tcp.bind绑定IP地址和端口,tcp.connect连接到指定IP和端口后计算数据传递前的Adler-32校验和,同时向服务端发送压缩后的目标数据。
3.核心代码
获取resources/rawfile目录下的文件内容
压缩实现
解压缩实现
创建TCPSocketServer连接
订阅TCPSocketServer的连接事件
创建TCPSocket连接,并向指定IP地址和端口发送数据。
场景二、基于Zip实现大文件的压缩与解压缩
1.效果图
2.方案
1)压缩方案:使用zlib.createZipSync创建压缩对象并初始化压缩流,循环判断当前文件是否已读取压缩完成,如未完成,则继续读取文件,使用zip.deflate压缩到buffer中并继续写入文件;
2)解压缩方案:使用zlib.createZipSync创建解压缩对象并初始化压缩流,循环判断当前文件是否已读取解压完成,如未完成,则继续读取文件,使用zip.inflate继续解压到buffer中并写入解压后的文件中。
3.核心代码
文件压缩实现
文件解压实现
场景三、基于GZip实现将字符串压缩写入gz文件
1.效果图
2.方案
使用createGZipSync创建GZip对象,通过gzip.gzwrite实现将buffer压缩进gz文件中
3.核心代码
场景四、解压读取html文件并加载
1.效果图
2.方案
1)通过createGZipSync创建GZip对象,使用gzread读取gz文件中并解压到buffer中,然后转为字符串类型;
2)通过webController加载html页面
3.核心代码
1)解压读取gz文件
2)加载html页面
