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

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