VBA解压缩ZIP文件07——length和distance扩展
时间:2022-07-22
本文章向大家介绍VBA解压缩ZIP文件07——length和distance扩展,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前面介绍压缩过程的时候,讲到过length和distance,因为数字范围有点大,ZIP中为了节省记录的信息,将其划分为29个区间,在从Huffman树中得到了length和distance之后,还需要到划分的区间进行一次扩展:
'扩展LengthCode、DistanceCode
Private Function ExtraValue(Value As Long, ValueArr() As CodeInterval, cpByte() As Byte, ByRef bitIndex As Long) As Long
Dim bValue As Long
If ValueArr(Value).Bits Then
bValue = GetBits(cpByte, bitIndex, ValueArr(Value).Bits)
bitIndex = bitIndex + ValueArr(Value).Bits
Value = ValueArr(Value).Start + bValue
Else
Value = ValueArr(Value).Start
End If
ExtraValue = Value
End Function
2个区间的初始过程:
'分区间的数据
Private Type CodeInterval
Bits As Long
Start As Long
End As Long
End Type
Private Function InitLengthCode()
LengthCode(0).Bits = 0: LengthCode(0).Start = 3: LengthCode(0).End = 3
LengthCode(1).Bits = 0: LengthCode(1).Start = 4: LengthCode(1).End = 4
LengthCode(2).Bits = 0: LengthCode(2).Start = 5: LengthCode(2).End = 5
LengthCode(3).Bits = 0: LengthCode(3).Start = 6: LengthCode(3).End = 6
LengthCode(4).Bits = 0: LengthCode(4).Start = 7: LengthCode(4).End = 7
LengthCode(5).Bits = 0: LengthCode(5).Start = 8: LengthCode(5).End = 8
LengthCode(6).Bits = 0: LengthCode(6).Start = 9: LengthCode(6).End = 9
LengthCode(7).Bits = 0: LengthCode(7).Start = 10: LengthCode(7).End = 10
LengthCode(8).Bits = 1: LengthCode(8).Start = 11: LengthCode(8).End = 12
LengthCode(9).Bits = 1: LengthCode(9).Start = 13: LengthCode(9).End = 14
LengthCode(10).Bits = 1: LengthCode(10).Start = 15: LengthCode(10).End = 16
LengthCode(11).Bits = 1: LengthCode(11).Start = 17: LengthCode(11).End = 18
LengthCode(12).Bits = 2: LengthCode(12).Start = 19: LengthCode(12).End = 22
LengthCode(13).Bits = 2: LengthCode(13).Start = 23: LengthCode(13).End = 26
LengthCode(14).Bits = 2: LengthCode(14).Start = 27: LengthCode(14).End = 30
LengthCode(15).Bits = 2: LengthCode(15).Start = 31: LengthCode(15).End = 34
LengthCode(16).Bits = 3: LengthCode(16).Start = 35: LengthCode(16).End = 42
LengthCode(17).Bits = 3: LengthCode(17).Start = 43: LengthCode(17).End = 50
LengthCode(18).Bits = 3: LengthCode(18).Start = 51: LengthCode(18).End = 58
LengthCode(19).Bits = 3: LengthCode(19).Start = 59: LengthCode(19).End = 66
LengthCode(20).Bits = 4: LengthCode(20).Start = 67: LengthCode(20).End = 82
LengthCode(21).Bits = 4: LengthCode(21).Start = 83: LengthCode(21).End = 98
LengthCode(22).Bits = 4: LengthCode(22).Start = 99: LengthCode(22).End = 114
LengthCode(23).Bits = 4: LengthCode(23).Start = 115: LengthCode(23).End = 130
LengthCode(24).Bits = 5: LengthCode(24).Start = 131: LengthCode(24).End = 162
LengthCode(25).Bits = 5: LengthCode(25).Start = 163: LengthCode(25).End = 194
LengthCode(26).Bits = 5: LengthCode(26).Start = 195: LengthCode(26).End = 226
LengthCode(27).Bits = 5: LengthCode(27).Start = 227: LengthCode(27).End = 257
LengthCode(28).Bits = 0: LengthCode(28).Start = 258: LengthCode(28).End = 258
End Function
Private Function InitDistanceCode()
DistanceCode(0).Bits = 0: DistanceCode(0).Start = 1: DistanceCode(0).End = 1 '
DistanceCode(1).Bits = 0: DistanceCode(1).Start = 2: DistanceCode(1).End = 2
DistanceCode(2).Bits = 0: DistanceCode(2).Start = 3: DistanceCode(2).End = 3
DistanceCode(3).Bits = 0: DistanceCode(3).Start = 4: DistanceCode(3).End = 4
DistanceCode(4).Bits = 1: DistanceCode(4).Start = 5: DistanceCode(4).End = 6
DistanceCode(5).Bits = 1: DistanceCode(5).Start = 7: DistanceCode(5).End = 8
DistanceCode(6).Bits = 2: DistanceCode(6).Start = 9: DistanceCode(6).End = 12
DistanceCode(7).Bits = 2: DistanceCode(7).Start = 13: DistanceCode(7).End = 16
DistanceCode(8).Bits = 3: DistanceCode(8).Start = 17: DistanceCode(8).End = 24
DistanceCode(9).Bits = 3: DistanceCode(9).Start = 25: DistanceCode(9).End = 32
DistanceCode(10).Bits = 4: DistanceCode(10).Start = 33: DistanceCode(10).End = 48
DistanceCode(11).Bits = 4: DistanceCode(11).Start = 49: DistanceCode(11).End = 64
DistanceCode(12).Bits = 5: DistanceCode(12).Start = 65: DistanceCode(12).End = 96
DistanceCode(13).Bits = 5: DistanceCode(13).Start = 97: DistanceCode(13).End = 128
DistanceCode(14).Bits = 6: DistanceCode(14).Start = 129: DistanceCode(14).End = 192
DistanceCode(15).Bits = 6: DistanceCode(15).Start = 193: DistanceCode(15).End = 256
DistanceCode(16).Bits = 7: DistanceCode(16).Start = 257: DistanceCode(16).End = 384
DistanceCode(17).Bits = 7: DistanceCode(17).Start = 385: DistanceCode(17).End = 512
DistanceCode(18).Bits = 8: DistanceCode(18).Start = 513: DistanceCode(18).End = 768
DistanceCode(19).Bits = 8: DistanceCode(19).Start = 769: DistanceCode(19).End = 1024
DistanceCode(20).Bits = 9: DistanceCode(20).Start = 1025: DistanceCode(20).End = 1536
DistanceCode(21).Bits = 9: DistanceCode(21).Start = 1537: DistanceCode(21).End = 2048
DistanceCode(22).Bits = 10: DistanceCode(22).Start = 2049: DistanceCode(22).End = 3072
DistanceCode(23).Bits = 10: DistanceCode(23).Start = 3073: DistanceCode(23).End = 4096
DistanceCode(24).Bits = 11: DistanceCode(24).Start = 4097: DistanceCode(24).End = 6144
DistanceCode(25).Bits = 11: DistanceCode(25).Start = 6145: DistanceCode(25).End = 8192
DistanceCode(26).Bits = 12: DistanceCode(26).Start = 8193: DistanceCode(26).End = 12288
DistanceCode(27).Bits = 12: DistanceCode(27).Start = 12289: DistanceCode(27).End = 16384
DistanceCode(28).Bits = 13: DistanceCode(28).Start = 16385: DistanceCode(28).End = 24576
DistanceCode(29).Bits = 13: DistanceCode(29).Start = 24577: DistanceCode(29).End = 32768
End Function
这个区间的扩展函数静态Huffman和动态Huffman是一致的。
- 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 数组属性和方法
- Win10+Unlocker3+VMware15.5+MacOS10.14+xcode+QT for ios+虚拟机苹果系统 自用 实践笔记
- OpenGL ES 纹理过滤模式-glTexParameteri
- Jenkins时间修改为北京时间
- OpenGL ES for Android 绘制一个点
- OpenGL ES for Android 绘制线
- Jenkins自定义主题
- OpenGL ES for Android 绘制三角形
- Centos7 安装 Tomcat8 的正确姿势 并设置开机自启 实践笔记
- ASP.NET Core 使用 Google 验证码(reCAPTCHA v3)代替传统验证码
- Centos7 安装 Tomcat8 伪集群 的正确姿势 并设置开机自启 实践笔记
- 问题合集,持续更新
- ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
- 基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
- OpenGL ES 变量、结构体、语句、函数、精度
- OpenGL ES for Android 绘制矩形和正方形