VBA解压缩ZIP文件09——解压-静态Huffman
时间:2022-07-22
本文章向大家介绍VBA解压缩ZIP文件09——解压-静态Huffman,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用静态Huffman压缩的数据块,在数据块的开头仍然是3个bit的Header,第2个bit是1、第3个bit是0,因为读取过程是先读取低位,再读取高位,所以结果应该是二进制01。
接下来的数据就是被压缩的数据,因为静态Huffman的h1(编码literal和length)是固定的,不需要记录压缩过程的信息:
初始过程:
Private Function InitFixedHuffmanTree() Dim i As Long Dim arr() As Long ReDim arr(287) As Long For i = 0 To 143 arr(i) = 8 Next For i = 144 To 255 arr(i) = 9 Next For i = 256 To 279 arr(i) = 7 Next For i = 280 To 287 arr(i) = 8 Next Set hFixed = CreateHuffman(arr) Erase arrEnd Functio
h2(编码distance)不需要,直接固定按5个bit来编码。
解压过程:
'静态Huffman
Private Function InflateByFixedHuffman(ByRef cpByte() As Byte, ByRef uncpByte() As Byte, ByRef bitIndex As Long, ByRef pUncp As Long)
Dim ilen As Long
Dim iDistance As Long
Dim i As Long
Dim bValue As Long
'按hFixed解码一个数字
bValue = hFixed.GetLeafKey(cpByte, bitIndex)
Do Until bValue = 256
If bValue < 256 Then
uncpByte(pUncp) = bValue
pUncp = pUncp + 1
Else
ilen = bValue - 257
ilen = ExtraValue(ilen, LengthCode, cpByte, bitIndex)
'Distance来说,需要对Code=0-29的数进行编码,则直接采用5比特表示
iDistance = GetBitsRev(cpByte, bitIndex, 5)
bitIndex = bitIndex + 5
iDistance = ExtraValue(iDistance, DistanceCode, cpByte, bitIndex)
'根据长度和距离复制数据
For i = 1 To ilen
uncpByte(pUncp) = uncpByte(pUncp - iDistance)
' Debug.Print pUncp, VBA.Hex(uncpByte(pUncp))
pUncp = pUncp + 1
Next
End If
bValue = hFixed.GetLeafKey(cpByte, bitIndex)
Loop
End Function
静态Huffman解压过程要特别注意的是iDistance的5bit编码,在前面读取Header、HLIT、HDIST、HCLEN以及CCL的时候,都是先读取低位,再读取高位,然后组合为一个整数。
iDistance的5bit读取过程自然还是一样的,但是它的编码却是相反的,先读取出来的低位要放置到最高位。
- 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 数组属性和方法
- Python+Appium运行简单的demo,你需要理解Appium运行原理!
- 网站日志分析完整实践【技术创造101训练营】
- HTML前端知识
- 掌握 AST,轻松落地关键业务「技术创作101训练营」
- 一文轻松学会linux字符设备驱动
- leetcode树之N叉树的前序遍历
- 2020-09-20:如何判断一个数是质数?
- 金九银十Android面试复习题集:关于四大组件中的Activity你了解多少?
- HaseMap的循环姿势你真的懂了吗?
- 历经14天自定义3个注解解决项目的3个Swagger难题
- VUE开发–获取DOM对象和组件对象(十九)
- RASP攻防 —— RASP安全应用与局限性浅析
- JavaScript 交换值的奇思妙想
- Docker体验(一)
- (二)Hadoop集群配置安装