CryptDecode mit Modifikator CRYPT_ARCH_ZIP - Wie verwenden? - Seite 6

 
Mikalas:

Entpacken Sie Standard-ZIP-Dateien!

(im Moment nur mit einer gepackten Datei im Archiv, später werde ich es für mehrere machen (falls nötig) )

Ich danke Ihnen. Genau das, was ich brauchte! Michael, das hast du sehr gut gemacht. Ich werde am Abend damit beginnen, es auszuarbeiten. Die Kommentare von MQ sind jedoch weiterhin erforderlich.
 
Meines wurde nicht entpackt, sondern gab einen internen Fehler (4024)
 
Mikalas:

Entpacken Sie Standard-ZIP-Dateien!

(im Moment nur mit einer gepackten Datei im Archiv, später werde ich es für mehrere machen (falls nötig) )

Hängen Sie die entpackte Zip-Datei an.
 

Er hat also seine eigene Akte?

und ich war glücklich)

ZS: selbst wenn es nur sein eigenes ist, ist es schon großartig

 
sanyooooook:

Er hat also seine eigene Akte?

und ich war glücklich)

ZS: Auch wenn es nur sein eigenes ist, ist es schon großartig.

Ich werde versuchen, es heute zu tun.
Dateien:
GAZR-6_15.zip  1 kb
 

Wassilij!

Ist dies notwendig oder nicht?

 
Mikalas:

Wassilij!

Müssen Sie es tun oder nicht?

Noch nicht. Wir werden die Kommentare von MQ am Montag sehen. Aus Alexanders Beitrag geht hervor, dass es sich um Ihren Zip-Archiver handelt. Andere Archive entpacken Ihren Code nicht:

sanyooooook:
Ich hatte Probleme beim Dekomprimieren, was zu einem internen Fehler führte (4024)

s.s. Zumindest der Fehler ist anders.

Mikalas:

Dekomprimiert Standard-ZIP-Dateien!

(vorerst nur mit einer gepackten Datei im Archiv, dann werde ich es für mehrere tun (wenn nötig) )

Eine andere Frage. Welches Zip-Archivierungsprogramm haben Sie verwendet, und welche Parameter haben Sie verwendet (Komprimierungsverhältnis, Wörterbuchgröße).
 
C-4:

Noch nicht. Wir werden die Kommentare von MQ am Montag sehen. Aus Alexanders Beitrag geht hervor, dass es sich um Ihren Zip-Archiver handelt. Bei anderen Archiven lässt sich Ihr Code nicht dekomprimieren:

s.w. Zumindest der Fehler ist anders.

Eine andere Frage. Welches Zip-Archivierungsprogramm haben Sie zum Erstellen des Archivs verwendet und welche Parameter haben Sie verwendet (Komprimierungsverhältnis, Wörterbuchgröße).

WinRar mit Standardeinstellungen.

Ich weiß, wie man alle Archive dekomprimiert.

Aber es dauert ein bisschen, um die 4 Bytes des MQ-Packers herauszufinden

Wenn nötig, werde ich es tun.

MQ darf nicht antworten:)

 

Die letzten 4 Bytes im MQ-Packer sind Hash oder CRC

(Dienstinformationen).

Es ist jedoch nicht klar, ob es sich um die gepackten Daten oder die Rohdaten handelt.

Wir werden die Antwort von MQ abwarten müssen.

 

In der Zwischenzeit sieht es so aus:

//+------------------------------------------------------------------+
//|                                                  Zip_decoder.mqh |
//|                                          Copyright 2015, Mikalas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
struct ZIP_HEADER
{
  uint   sign;
  ushort a_version;
  ushort bit_flag;
  ushort comp_method;
  ushort last_mod_time;
  ushort last_mod_date;
  int    crc_32;
  uint   pack_size;
  uint   unpack_size;
  ushort fn_len;
  ushort extr_field_len;
};
//
ZIP_HEADER zip_header;
bool f_found;
//+------------------------------------------------------------------+
//| Get entryes in ZIP file                                          |
//+------------------------------------------------------------------+
uint GetEntryesZip( const string file_name, string  &f_names[] )
{
  uint a_cnt = 0;
  uchar array[];
  int handle = FileOpen( file_name, FILE_READ | FILE_BIN );
  if ( handle != INVALID_HANDLE )
  {
    ulong file_size = FileSize( handle );
    if ( file_size > 0 ) 
    {
      while ( FileTell( handle ) < file_size - 4 )
      {
        zip_header.sign = FileReadInteger( handle, 4 );
        
        if ( zip_header.sign == 0x04034b50 )
        {
          a_cnt++;  
          ArrayResize( f_names, a_cnt );
          f_names[ a_cnt - 1] = "";  
          FileSeek( handle, -4, SEEK_CUR );
          FileReadStruct( handle, zip_header ); 
          if ( zip_header.extr_field_len != 0 )
          {
            FileSeek( handle, zip_header.extr_field_len, SEEK_CUR );
          }
          ArrayResize( array, int( zip_header.fn_len ) );
          uint fn_res = FileReadArray( handle, array, 0, int( zip_header.fn_len ) );
          for ( int i = 0; i < int( fn_res ); i++ )
          {
            f_names[a_cnt - 1] += CharToString( array[i] );
          }
          FileSeek( handle, zip_header.pack_size, SEEK_CUR );
        }
      }
    }
    FileClose( handle );
  }
  return( a_cnt );
}
bool GetFile( const string src_name, const string dest_name, const int position, uchar &unp_data[] )
{
  uchar array[];
  uchar key[];
  f_found = false;
  int f_cnt = 0;
  int handle = FileOpen( src_name, FILE_READ | FILE_BIN );
  if ( handle != INVALID_HANDLE )
  {
    ulong file_size = FileSize( handle );
    if ( file_size > 0 ) 
    {
      while ( FileTell( handle ) < file_size - 4 )
      {
        zip_header.sign = FileReadInteger( handle, 4 );
        
        if ( zip_header.sign == 0x04034b50 )
        {
          f_cnt++;
          FileSeek( handle, -4, SEEK_CUR );
          FileReadStruct( handle, zip_header ); 
          if ( zip_header.extr_field_len != 0 )
          {
            FileSeek( handle, zip_header.extr_field_len, SEEK_CUR );
          }
          ArrayResize( array, int( zip_header.fn_len ) );
          
          uint fn_res = FileReadArray( handle, array, 0, int( zip_header.fn_len ) );
          
          string file_name = "";
          for ( int i = 0; i < int( fn_res ); i++ )
          {
            file_name += CharToString( array[i] );
          }  
          if ( ( file_name == dest_name ) && ( position == f_cnt - 1 ) )
          {
            f_found = true;
            ArrayResize( array, int( zip_header.pack_size ) + 6 );
            
            uint ar_res = FileReadArray( handle, array, 2, int( zip_header.pack_size ) );  
            if ( ar_res == uint( zip_header.pack_size ) ) 
            {
              array[0] = 0x78;
              array[1] = 0x5E;
              array[int( zip_header.pack_size ) + 2] = 193;  //Wait MQ !!!!!!!!!!!!!!!!!!!!!!!!!
              array[int( zip_header.pack_size ) + 3] = 12;   //Wait MQ !!!!!!!!!!!!!!!!!!!!!!!!
              array[int( zip_header.pack_size ) + 4] = 31;   //Wait MQ !!!!!!!!!!!!!!!!!!!!!!!!!
              array[int( zip_header.pack_size ) + 5] = 159;  //Wait MQ !!!!!!!!!!!!!!!!!!!!!!!!!!!
              ArrayResize( key, int( zip_header.pack_size ) + 6 );
              for ( int j = 0; j < int( zip_header.pack_size ) + 6; j++ ) key[j] = 0;
              ResetLastError();
              int dec_res = CryptDecode( CRYPT_ARCH_ZIP, array, key, unp_data );
              if ( dec_res == int( zip_header.unpack_size ) )
              {
                FileClose( handle );
                return( true );
              }
              else
              {
                Print( " Ошибка распаковки = ", GetLastError() );
                FileClose( handle );
                return( false );
              }
            } 
            break;
          }
          if ( f_found ) break;  
          FileSeek( handle, zip_header.pack_size, SEEK_CUR );
        }
      }
    }
    FileClose( handle );
  }
  return( false );
}

Aufrufen von Funktionen:

//+------------------------------------------------------------------+
//|                                                     Zip_test.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
#include "Zip_decoder.mqh";
//
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string file_name = "Files.zip";
   string file_names[];
   uchar result[];
   uint files_tot = GetEntryesZip( file_name, file_names );
   if ( GetFile( file_name, file_names[1], 1, result ) )
   {
     Print( "Файл распакован. Имя файла = ", file_names[1] );
   }
//---
   return(INIT_SUCCEEDED);
  }

Extrahiert die 2. Datei (GAZR-6.15.dat) des Archivs. Das Archiv wird von WinRar mit Standardeinstellungen erstellt.

In der Funktion GetFile() ist die Parameterposition (1) für die genaue Identifizierung der Datei im ZIP-Archiv erforderlich.

Das Archiv kann Dateien mit identischen Namen enthalten.

2015.03.29 21:38:05.553 Zip_test (GAZR-6.15,M1) Файл распакован. Имя файла = GAZR-6.15.dat
Dateien:
Files.zip  1 kb