前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA解压缩ZIP文件08——解压-没有压缩

VBA解压缩ZIP文件08——解压-没有压缩

作者头像
xyj
发布2020-07-29 11:31:32
1.5K0
发布2020-07-29 11:31:32
举报
文章被收录于专栏:VBA 学习VBA 学习

解析了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,根据这个,解压代码如下:

代码语言:javascript
复制
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

补码应该是作为校验用的,这里忽略了校验。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档