我有一个数据库,我们使用以下代码存储使用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,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,(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)和我不再有可用于解压缩的库,我想知道是否有人知道任何解压缩这些文件的方法可能使用另一个库或方法.
解决方法
此代码来自
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); } } }