2013-03-28 7 views
6

Mam bazę danych, w której przechowywane pliki pdf skompresowane DynaZip Max Secure, stosując następujący kod:Czy istnieje sposób na dekompresję pliku DynaZip Max do innej biblioteki? 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; 
} 

i to jest kod 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; 
    } 
} 

dam nic w przeciwnym razie, aby odświeżyć tę zagadkę, Ive próbował bez problemu dekompresować Zip, Gliip, Gzip. Będę wdzięczny za każdą pomoc. Dziękuję Ci.

Edit: Problemem jest to, że DinaZip jest propietary, odstawić biblioteka, bez pomocy i rozwiązywania problemów przez spółkę że zwolniony, mam zlecone do dekompresji kilka plików, które zostały uprzednio skompresowany przy użyciu tej biblioteki (z kodem avobe) i nie mam już biblioteki dostępnej do dekompresji, zastanawiam się, czy ktokolwiek zna jakikolwiek sposób na dekompresję tych plików może używając innej biblioteki lub metody.

+0

W której linii występuje błąd i jaki jest komunikat o błędzie? –

+0

@JeremyThompson Kod avobe został użyty do kompresowania plików przy użyciu biblioteki DinaZip Max Secure. Muszę je rozpakować, próbowałem użyć funkcji ZlibStream i ZipFile biblioteki DotNetZip, aby je rozpakować, ale generuje błąd informujący, że nie jest to prawidłowy plik Zip lub Zlib. Zastanawiam się, czy ktoś wie, jak rozpakować ten rodzaj plik. –

+0

Juust chciał wskazać na coś, co już znasz, ale inni nie mogą: implementacja szyfrowania dynazip nie jest zgodna z żadną z innych głównych bibliotek. co oznacza, że ​​aby rozpakować archiwum zaszyfrowane dynazipem, musisz mieć dynazip. Nikt inny. Opcja. –

Odpowiedz

9

Ten kod jest od https://zlibnet.codeplex.com i może rozpakować nieszyfrowanych strumieni 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 strumień jest po prostu DeflateStream z nagłówkiem PKZIP, więc ten kod po prostu pominąć ten nagłówek.

+0

To mi pomogło, na szczęście strumienie, które zapisaliśmy tam, gdzie nie były szyfrowane. Dziękujemy –

+0

Co się stanie, jeśli dane zostały zapisane w postaci zaszyfrowanej? – MoonKnight

+0

Killercam: Nie wiem. Czy jest zaszyfrowany za pomocą Dynazip Max z Dynazip Secure? – osexpert

Powiązane problemy