【问题标题】:Is there a way to decompress a DynaZip Max file with another library? F.E. DotNetZip有没有办法用另一个库解压缩 DynaZip Max 文件? F.E. DotNetZip
【发布时间】:2013-03-18 07:24:05
【问题描述】:

我有一个数据库,我们使用以下代码存储了使用 DynaZip Max Secure 压缩的 pdf 文件:

MemoryStream msIN = new System.IO.MemoryStream();   //Input MemoryStream
MemoryStream msZip = new System.IO.MemoryStream();  //Compressed MemoryStream
BinaryReader objBinaryReader;
BinaryWriter objBinaryWriter;


public MemoryStream CompressStream(byte[] vbuf)
{
    System.IO.BinaryWriter bw = new System.IO.BinaryWriter(msIN);
    bw.Write(vbuf);
    CDZipSNET dz1 = new CDZipSNET();
    dz1.ZipMemToMemCallback += new CDZipSNET.OnZipMemToMemCallback(this.ZipMemToMemCallback_event);
    dz1.ActionDZ = CDZipSNET.DZACTION.ZIP_MEMTOMEM;
    return msZip;
}

这是 ZipMemToMemCallback_event 代码:

public void ZipMemToMemCallback_event(CDZipSNET.MEMTOMEMACTION lAction,ref byte[] lpMemBuf,ref uint pdwSize,uint dwTotalReadL,uint dwTotalReadH,uint dwTotalWrittenL,uint dwTotalWrittenH,ref CDZipSNET.MEMTOMEMRESPONSE plRet)
{
    int bytesToRead;

    switch(lAction)
    {
        case CDZipSNET.MEMTOMEMACTION.MEM_READ_DATA:
            if((dwTotalReadL == 0) && (dwTotalReadH == 0))
            {
                msIN.Seek(0, System.IO.SeekOrigin.Begin);
                objBinaryReader = new System.IO.BinaryReader(msIN);
            }
            try
            {
                bytesToRead = (int)(objBinaryReader.BaseStream.Length - dwTotalReadL);
                if(bytesToRead > pdwSize)
                {
                    bytesToRead = (int)pdwSize;
                    plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_CONTINUE;
                }
                else
                { 
                    plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_DONE; 
                }
                pdwSize = (uint)bytesToRead;
                if(bytesToRead > 0)
                { 
                    objBinaryReader.Read(lpMemBuf, 0, bytesToRead); 
                }
            }
            catch 
            { 
                plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_ERROR; 
            }
            break;

        case CDZipSNET.MEMTOMEMACTION.MEM_WRITE_DATA:
            if((dwTotalWrittenL == 0) && (dwTotalWrittenH == 0))
            { 
                objBinaryWriter = new System.IO.BinaryWriter(msZip); 
            }
            try
            {
                objBinaryWriter.Write(lpMemBuf, 0, (int)pdwSize);
                plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_CONTINUE;
            }
            catch (System.Exception)
            { 
                plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_ERROR; 
            }
            break;

        default: plRet = CDZipSNET.MEMTOMEMRESPONSE.MEM_ERROR;
            break;
    }
}

我会提供任何其他必要的东西来解答这个谜题,我尝试过常规的 Zip 解压缩、Zlib、Gzip 都无济于事。我将不胜感激。谢谢。

编辑: 问题在于 DinaZip 是一个专有的、已停产的库,发布它的公司没有提供任何帮助或故障排除,我被委托解压缩一堆以前压缩过的文件使用这个库(使用代码 avobe)并且我不再有可用于解压缩的库,我想知道是否有人知道任何方法可以使用其他库或方法来解压这些文件。

【问题讨论】:

  • 错误出现在哪一行,错误信息是什么?
  • @JeremyThompson 代码 avobe 用于压缩文件,使用 DinaZip Max Secure 库。我需要解压它们,我尝试使用 DotNetZip 库的 ZlibStream 和 ZipFile 函数来解压它们,但是它抛出一个错误,告诉我它不是一个有效的 Zip 或 Zlib 文件,我想知道是否有人知道如何解压这种文件。
  • 只是想指出一些您已经知道但其他人可能不知道的事情:加密的 dynazip 实现与任何其他主要库不兼容。这意味着要解压缩使用 dynazip 加密的存档,您必须使用 dynazip。没有其他。选项。

标签: c# zip gzip zlib dotnetzip


【解决方案1】:

此代码来自https://zlibnet.codeplex.com,它可以解压未加密的DynaZip流:

public static class DynazipCompressor
{
    const int DZ_DEFLATE_POS = 46;

    public static bool IsDynazip(byte[] source)
    {
        return source.Length >= 4 && BitConverter.ToInt32(source, 0) == 0x02014b50;
    }

    public static byte[] DeCompress(byte[] source)
    {
        if (!IsDynazip(source))
            throw new InvalidDataException("not dynazip header");
        using (MemoryStream srcStream = new MemoryStream(source, DZ_DEFLATE_POS, source.Length - DZ_DEFLATE_POS))
        using (MemoryStream dstStream = DeCompress(srcStream))
            return dstStream.ToArray();
    }

    private static MemoryStream DeCompress(Stream source)
    {
        MemoryStream dest = new MemoryStream();
        DeCompress(source, dest);
        dest.Position = 0;
        return dest;
    }

    private static void DeCompress(Stream source, Stream dest)
    {
        using (DeflateStream zsSource = new DeflateStream(source, CompressionMode.Decompress, true))
        {
            zsSource.CopyTo(dest);
        }
    }
}

DynaZip 流只是带有 PKZIP 标头的 DeflateStream,因此此代码只是跳过标头。

【讨论】:

  • 这对我有很大帮助,幸运的是我们存储的流未加密。谢谢
  • 如果数据是加密存储的呢?
  • Killercam:我不知道。是否使用 Dynazip Secure 的 Dynazip Max 加密?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多