代码之家  ›  专栏  ›  技术社区  ›  Alberto Rechy

有没有办法用另一个库解压缩DynaZip Max文件?F.E.DotNetZip公司

  •  6
  • Alberto Rechy  · 技术社区  · 12 年前

    我有一个数据库,我们在其中存储了使用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代码),我不再有这个库可用于解压缩,我想知道是否有人知道如何解压缩这些文件,也许可以使用另一个库或方法。

    1 回复  |  直到 12 年前
        1
  •  9
  •   osexpert    12 年前

    此代码来自 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,因此此代码只跳过标头。

    推荐文章