2013-03-28 3 views
6

Ich habe eine Datenbank, in der wir mit DynaZip Max Secure komprimierten PDF-Dateien gespeichert ist, mit dem folgenden Code:Gibt es eine Möglichkeit, eine DynaZip Max-Datei mit einer anderen Bibliothek zu dekomprimieren? FE DotNetZip

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; 
} 

Und dies ist der ZipMemToMemCallback_event Code:

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; 
    } 
} 

Ich werde alles bieten Um dieses Rätsel zu meistern, habe ich die normale Zip-Dekomprimierung, Zlib, Gzip vergeblich versucht. Ich werde jede Hilfe schätzen. Danke.

Edit: Das Problem ist, dass DinaZip eine propietary, auslaufend Bibliothek ist, ohne Hilfe oder Problem von der Firma, die sie veröffentlichte, ich bin commisioned eine Reihe von Dateien zu dekomprimieren, die diese Bibliothek vorher komprimiert wurden unter Verwendung von (Mit dem Code avobe) und ich habe nicht mehr die Bibliothek für die Dekomprimierung zur Verfügung, ich frage mich, ob irgendjemand eine Möglichkeit kennt, diese Dateien zu dekomprimieren, vielleicht mit einer anderen Bibliothek oder Methode.

+0

In welcher Zeile tritt der Fehler auf und was ist die Fehlermeldung? –

+0

@ JeremyThompson Der Code Avobe wurde zum Komprimieren der Dateien mit der DinaZip Max Secure-Bibliothek verwendet. Ich muss sie entpacken, ich habe versucht, die ZlibStream- und ZipFile-Funktionen der DotNetZip-Bibliothek zu verwenden, um sie zu dekomprimieren, aber es gibt einen Fehler, der mir sagt, dass es keine gültige Zip- oder Zlib-Datei ist Datei. –

+0

Juust wollte etwas hervorheben, das Sie bereits kennen, aber andere nicht: Die dynazip-Implementierung der Verschlüsselung ist mit keiner der anderen Hauptbibliotheken kompatibel. Das bedeutet, dass Sie ein mit dynazip verschlüsseltes Archiv dekomprimieren müssen, um dynazip zu verwenden. Kein anderer. Möglichkeit. –

Antwort

9

Dieser Code ist aus https://zlibnet.codeplex.com und es kann unverschlüsselt DynaZip Ströme dekomprimieren:

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); 
     } 
    } 
} 

Ein DynaZip Strom ist einfach ein DeflateStream mit PKZIP-Header, so dass dieser Code nur den Header überspringen.

+0

Das hat mir sehr geholfen, glücklicherweise sind die von uns gespeicherten Streams unverschlüsselt. Danke –

+0

Was ist, wenn die Daten verschlüsselt gespeichert wurden? – MoonKnight

+0

Killercam: Ich weiß es nicht. Ist es mit Dynazip Max von Dynazip Secure verschlüsselt? – osexpert

Verwandte Themen