我正在通过一些使用zLib1.dll解压缩支持文件的古老C代码。我需要一个如何进入"解压缩"使用Visual Basic .NET在DLL中运行。
我知道这可能会出现,所以这里有一些我已经研究过的事情:
我知道zLib1.dll有一个.NET包装器。事实上,如果您下载源代码,它甚至会在zip文件中。问题是帮助文件(chm)不会打开,所以我无法阅读文档来阅读它
这可能是一个解决方法......我看到人们提到使用内置压缩......但是这样做是否像zLib一样工作?如果文件不使用与zLib相同的算法,我将不会尝试解压缩文件。
请不要建议我使用winzip或类似的东西,因为它不会起作用。这些支持文件具有特殊标题,罐装包将无法理解。我必须能够解压缩文件中的特定字节。
答案 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