VBA解压缩ZIP文件08——解压-没有压缩
时间:2022-07-22
本文章向大家介绍VBA解压缩ZIP文件08——解压-没有压缩,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
解析了ZIP文件结构后,我们就能够通过LocalFileHeader的信息计算出压缩信息所在ZIP文件中的偏移,并读取相应的压缩数据。
读取了压缩数据之后,接下来就是对数据进行解压,在VBA解压缩ZIP文件02——压缩过程中讲到了,有3种压缩方式,最简单的就是没有压缩。
这种没有压缩的数据块,压缩程序在数据块的前面存放了3个bit的Header,第2、3个bit都是0,然后压缩程序会在这里补齐1个Byte。
因为ZIP压缩数据的存储最小单位是bit,某一个压缩数据块,它很有可能不是从某个Byte开始的,所以在解压的过程中,需要一直记录bit的位置,在碰到没有压缩的数据块的时候,补齐到8的整数倍。
补齐之后,压缩数据块使用2个byte存储了没有压缩过的数据的长度LEN,再用2个byte记录了LEN的补码NLEN,根据这个,解压代码如下:
Private Function InflateNoCompression(ByRef cpByte() As Byte, ByRef uncpByte() As Byte, ByRef bitIndex As Long, ByRef pUncp As Long) As Long
Dim ilen As Long
Dim nlen As Long
'跳过当前处理的字节中剩余的位
Do While bitIndex Mod 8
bitIndex = bitIndex + 1
Loop
' 读入LEN和NLEN
' 向输出拷贝LEN字节
' 0 1 2 3 4...
' +---+---+---+---+================================+
' | LEN | NLEN |... LEN bytes of literal data...|
' +---+---+---+---+================================+
'
' LEN是块中的字节数,NLEN是LEN的补码
ilen = GetBits(cpByte, bitIndex, 2 * 8)
bitIndex = bitIndex + 2 * 8
nlen = GetBits(cpByte, bitIndex, 2 * 8)
bitIndex = bitIndex + 2 * 8
Dim pcp As Long
pcp = bitIndex 8
Dim i As Long
For i = 0 To ilen - 1
uncpByte(pUncp) = cpByte(pcp + i)
pUncp = pUncp + 1
Next
bitIndex = bitIndex + ilen * 8
End Function
补码应该是作为校验用的,这里忽略了校验。
- dedecms自定义表单发布成功后返回当前页面
- 前端构建工具 Gulp.js 上手实例
- dedecms数据库内容替换安全确认码不显示怎么解决
- 利用宏避免发送确认邮件时忘记添加附件
- dateDiff在Objective-C中的实现
- 禁用Firefox自带的元素查看工具
- 容易被误解的overflow:hidden
- dedecms调用全站相关文章怎么设置
- dedecms自定义表单提交成功后提示信息修改和跳转链接修改
- dede:arclist orderby=weight dedecms列表页文章按权重排序无效问题
- Golang语言社区--Go语言基础第二节变量
- 如何让帝国CMS7.2搜索模板支持动态标签调用
- 数据视觉盛宴—数据可视化实践之美
- 使用Tensorflow对象检测在安卓手机上“寻找”皮卡丘
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法