我需要在Visual Basic .NET中使用zLib1.dll

时间:2015-12-07 02:02:31

标签: .net zlib

我正在通过一些使用zLib1.dll解压缩支持文件的古老C代码。我需要一个如何进入"解压缩"使用Visual Basic .NET在DLL中运行。

我知道这可能会出现,所以这里有一些我已经研究过的事情:

  1. 我知道zLib1.dll有一个.NET包装器。事实上,如果您下载源代码,它甚至会在zip文件中。问题是帮助文件(chm)不会打开,所以我无法阅读文档来阅读它

    1. 这可能是一个解决方法......我看到人们提到使用内置压缩......但是这样做是否像zLib一样工作?如果文件不使用与zLib相同的算法,我将不会尝试解压缩文件。

    2. 请不要建议我使用winzip或类似的东西,因为它不会起作用。这些支持文件具有特殊标题,罐装包将无法理解。我必须能够解压缩文件中的特定字节。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题(某种程度),看起来内置压缩看起来很好。这是我的最终解决方案:( AltDecompress是解压缩完成的地方,它调用了我为了清晰而包含的GetDataBlock

Public Function AltDecompress(data As Byte()) As Byte()
    Dim output = New MemoryStream()

    Dim tmp As Byte() = GetDataBlock(data, 2)  ' using .NET we have to strip the zLib header
    Using compressedStream = New MemoryStream(tmp)
        Using zlibStream = New DeflateStream(compressedStream, CompressionMode.Decompress)
            zlibStream.CopyTo(output)
            zlibStream.Close()
            output.Position = 0
            Return output.ToArray
        End Using
    End Using
End Function


Public Function GetDataBlock(ByRef Data As Byte(), ByVal start As Integer, Optional ByVal len As Integer = 0) As Byte()
    ' Extract a datablock from another datablock
    ' if len is not specified it will copy the entire block from the starting point to the end
    Dim BlockLen As Integer = Data.Length - start           ' Calculate the length of the data block

    ' Check if len was specified
    If len = 0 Then
        ' if not grab everything from start to end
        BlockLen = Data.Length - start
    Else
        ' Grab just the data asked for
        BlockLen = len
    End If

    Dim tmpBlock(BlockLen) As Byte   ' Create the target array
    Array.ConstrainedCopy(Data, start, tmpBlock, 0, BlockLen)   ' Copy the data
    Return tmpBlock  ' return the block

End Function