2013-03-28 6 views
6

Ho un database in cui abbiamo memorizzato i file PDF compressi con DynaZip Max Secure, utilizzando il seguente codice:C'è un modo per decomprimere un file DynaZip Max con un'altra libreria? 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; 
} 

E questo è il codice 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; 
    } 
} 

fornirò nulla altrimenti necessario per analizzare questo indovinello, ho provato regolarmente decompressione Zip, Zlib, Gzip inutilmente. Apprezzerò qualsiasi aiuto. Grazie.

Edit: Il problema è che è un DinaZip proprietarie, biblioteca interrotto, senza alcun aiuto o la risoluzione dei problemi da parte della società che ha rilasciato, sto commissionato per decomprimere un gruppo di file che sono stati precedentemente compresso utilizzando questa libreria (con il codice avobe) e non ho più la libreria disponibile per la decompressione, mi chiedo se qualcuno sa come decomprimere questo file magari usando un'altra libreria o metodo.

+0

In quale riga si verifica l'errore e quale è il messaggio di errore? –

+0

@JeremyThompson Il codice avobe è stato utilizzato per la compressione dei file, utilizzando la libreria DinaZip Max Secure. Ho bisogno di decomprimerli, ho provato ad usare le funzioni ZlibStream e ZipFile della libreria DotNetZip per decomprimerli, ma genera un errore che mi dice che non è un file Zip o Zlib valido, mi chiedo se qualcuno sa come decomprimere questo tipo di file. –

+0

Juust ha voluto indicare qualcosa che già conosci ma altri potrebbero non farlo: l'implementazione di dynazip della crittografia non è compatibile con nessuna delle altre principali librerie. il che significa che per decomprimere un archivio crittografato con dynazip si deve usare dynazip. Nessun altro. Opzione. –

risposta

9

Questo codice è da https://zlibnet.codeplex.com e può decomprimere flussi DynaZip crittografati:

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

Un DynaZip flusso è semplicemente un DeflateStream con un'intestazione PKZIP, pertanto questo codice solo saltare l'intestazione.

+0

Questo mi ha aiutato molto, fortunatamente i flussi che abbiamo archiviato dove non sono criptati. Grazie –

+0

Che dire se i dati sono stati memorizzati crittografati? – MoonKnight

+0

Killercam: non lo so. È crittografato con Dynazip Max di Dynazip Secure? – osexpert

Problemi correlati