CryptDecode mit Modifikator CRYPT_ARCH_ZIP - Wie verwenden? - Seite 10

 

Wassilij!

Ich habe nicht auf eine Antwort von Ihnen gewartet. (ich weiß nicht, ob MQ Zeit hatte, die Änderungen in Build 1100 zu implementieren)

Decoder:

//+------------------------------------------------------------------+
//|                                                  Zip_decoder.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//
#define uint_size  4
#define hdr_size   2
#define descr_size 12
//
struct ZIP_HEADER
{
  uint   sign;
  ushort a_version;
  ushort bit_flag;
  ushort comp_method;
  ushort last_mod_time;
  ushort last_mod_date;
  uint   crc_32;
  uint   pack_size;
  uint   unpack_size;
  ushort fn_len;
  ushort extr_field_len;
};
//---
struct ZIP_ENTRYES
{
  uint   file_count;
  string zip_fnames[];
  ulong  zip_offsets[];
  uint   pack_size[];
  uint   unpack_size[];
};
struct DATA_DESCRIPTOR
{
  uint crc_32;
  uint pack_size;
  uint unpack_size;
};
//
DATA_DESCRIPTOR data_descriptor;
ZIP_HEADER      zip_header;
ZIP_ENTRYES     zip_entryes;
uchar           key[] = {1,0,0,0};
bool            f_found;
uchar           f_name[];
bool            is_descr;
//+------------------------------------------------------------------+
//| Get entryes in ZIP file                                          |
//+------------------------------------------------------------------+
uint GetEntryesZip( int handle, ZIP_ENTRYES &f_entr )
{
//--- Check valid file handle
  if ( handle != INVALID_HANDLE )
  {
    f_entr.file_count = 0;
//---      
    ulong file_size = FileSize( handle );
    if ( file_size > 0 ) 
    {
//---Set file position to "0"
      FileSeek( handle, 0, SEEK_SET );
//---Build table           
      while ( FileTell( handle ) < ( file_size - uint_size ) )
      {
        zip_header.sign = FileReadInteger( handle, uint_size );
//---        
        if ( zip_header.sign == 0x04034b50 )
        {
          FileSeek( handle, -4, SEEK_CUR );
          f_entr.file_count++;
          FileReadStruct( handle, zip_header );
//---Check needed version 
          if ( ( zip_header.a_version != 0x0014 ) && ( f_entr.file_count == 1 ) )
          {
            Print( "Unsupported version!" );
            f_entr.file_count = 0;
            return( f_entr.file_count );
          }
          if ( ( zip_header.extr_field_len != 0 ) && ( f_entr.file_count == 1 ) )
          {
            Print( "File compressed using ZIP64 format!" );
            f_entr.file_count = 0;
            return( f_entr.file_count );
          }
//---Resize out data
          ArrayResize( f_entr.pack_size, f_entr.file_count );
          ArrayResize( f_entr.unpack_size, f_entr.file_count );   
          ArrayResize( f_entr.zip_fnames, f_entr.file_count );
          ArrayResize( f_entr.zip_offsets, f_entr.file_count );           
//---Check for sizes using extra bit
          if ( ( ( zip_header.bit_flag & 4 ) >> 2 ) == 1 )
          {
            is_descr = true; 
          }  
          else
          {
            is_descr = false;
            f_entr.pack_size[ f_entr.file_count - 1] = zip_header.pack_size;
            f_entr.unpack_size[ f_entr.file_count - 1] = zip_header.unpack_size;
          }
//---Get current file name
          ArrayResize( f_name, zip_header.fn_len );
          f_entr.zip_fnames[f_entr.file_count - 1] = ""; 
          uint fn_res = FileReadArray( handle, f_name, 0, int( zip_header.fn_len ) );
          for ( int i = 0; i < int( fn_res ); i++ )
           f_entr.zip_fnames[f_entr.file_count - 1] += CharToString( f_name[i] );
//---Store offset
          f_entr.zip_offsets[ f_entr.file_count - 1] = FileTell( handle );
//---Get descriptor, if present
          if ( is_descr )
          {
            uint sign;
            while ( FileTell( handle ) < ( file_size - uint_size ) )
            {
              sign = FileReadInteger( handle, uint_size );
              if ( ( sign == 0x04034b50 ) || ( sign == 0x02014b50 ) )
              {
//---Seek back for read descriptor              
                FileSeek( handle, -( uint_size + descr_size ), SEEK_CUR );
                FileReadStruct( handle, data_descriptor );
                f_entr.pack_size[ f_entr.file_count - 1] = data_descriptor.pack_size;
                f_entr.unpack_size[ f_entr.file_count - 1] = data_descriptor.unpack_size;
//---Align file positon to new file
                FileSeek( handle, f_entr.zip_offsets[f_entr.file_count - 1] +
                                  f_entr.pack_size[ f_entr.file_count - 1], SEEK_SET ); 
                break;                                  
              }
            }
          }
          else            
//---Seek to new file          
          FileSeek( handle, f_entr.pack_size[ f_entr.file_count - 1 ], SEEK_CUR ); 
        }
      }
    }
    else
    {
      Print( "Invalid zip file size!" );
    }
  }
  else
  {
    Print( "Invalid zip file handle!" );
  }  
  return( f_entr.file_count );
}
//+------------------------------------------------------------------+
//| Get file from ZIP file                                           |
//+------------------------------------------------------------------+
bool GetFile( const int handle, const ulong offset, const uint pack_size,
              const uint unp_size, uchar &unp_data[] )
{
  if ( ( handle != INVALID_HANDLE ) && ( pack_size != 0 ) && ( unp_size != 0 ) )
  {
    uchar pack_data[];
    ArrayResize( pack_data, pack_size + hdr_size );
    FileSeek( handle, offset, SEEK_SET );
    uint ar_res = FileReadArray( handle, pack_data, hdr_size, pack_size );
    if ( ar_res == pack_size )
    {
      pack_data[0] = 0x78;
      pack_data[1] = 0x5E;
      ResetLastError();
      uint dec_res = CryptDecode( CRYPT_ARCH_ZIP, pack_data, key, unp_data );
      if ( dec_res == unp_size )
      {
        return( true );
      }
      else
      {
        Print( "Last error = ", GetLastError() );
      }
    }
  }
  return( false );
}


Anrufe:

//+------------------------------------------------------------------+
//|                                                     Zip_test.mq5 |
//|                                          Copyright 2015, Mikalas |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Mikalas"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
#include "Zip_decoder.mqh";
//
int         zip_handle;
ZIP_ENTRYES entries;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string file_name = "Settings.zip";
   zip_handle = FileOpen( file_name, FILE_READ | FILE_BIN );
   
   if ( zip_handle != INVALID_HANDLE )
   {
     uint zip_files = GetEntryesZip( zip_handle, entries );
     if ( zip_files > 0 )
     {
//---Get 3 file from zip archive ([2])     
       uchar file_data[];
       if ( GetFile( zip_handle, entries.zip_offsets[2], entries.pack_size[2],
                     entries.unpack_size[2], file_data ) )
       {
         Print(" Unpack done.");
       }
       else
       {
         Print("Unpack failed!");
       }
     }
   }  
//---
   return(INIT_SUCCEEDED);
  }
void OnDeinit( const int reason )
{
  if ( zip_handle != INVALID_HANDLE ) FileClose( zip_handle );
}
 
Mikalas:

Wassilij!

Ich habe nicht auf eine Antwort von Ihnen gewartet. (ich weiß nicht, ob MQ Zeit hatte, die Änderungen in Build 1100 zu implementieren)

Decoder:

Anrufe:

Ich hatte keine Zeit. Das Bild 1100 wurde vor Beginn unserer Diskussion vorgestellt.
 
-Aleks-:

Mikalas, ist es möglich, die Dekodierung und Kodierung Code als eine Bibliothek mit einer Prüfung für das Entpacken Fertigstellung machen?

Ja, natürlich. Das werde ich in naher Zukunft tun. Es wird ein- und ausgepackt. Hinzufügen und Entfernen von Dateien aus dem Archiv. Solange CryptDecode nicht fehlschlägt.
 
C-4:
Ja, sicher. Das werde ich in naher Zukunft auch tun. Es wird ein- und ausgepackt. Hinzufügen und Entfernen von Dateien aus dem Archiv. Die Hauptsache ist, dass CryptDecode nicht versagt.

Wassilij!

Ist eine ZIP-Verpackung notwendig?

Ich glaube nicht, dass es das wert ist.

1. Wenn Sie eine Datenbank auf der Grundlage von ZIP erstellen wollen, ist dies nicht relevant.

Bald wird MQ Standardfunktionen für die Arbeit mit der Datenbank hinzufügen (Renat hat eine Umfrage durchgeführt).

2. Sie können das Problem nicht lösen, wenn die Dateigröße größer als uint ist.

Es sollte eine ZIP64-Komprimierung für ulong-Größen geben.

3. Sie wissen nicht genau, wie die MT5-Daten komprimiert werden

Es ist möglich, dass große Dateien (auch mit geringer Größe)

Große Dateien (auch mit geringer Größe) werden stundenlang komprimiert!

4. Um Dateien in ein Archiv zu "packen", müssen Sie eine ganze Reihe von Informationen in

eine Menge Informationen im Speicher - es wird HARDWARE geben!

Ich rate dringend davon ab....

 

Ich denke wahrscheinlich altmodisch, aber für mich ist die Archivierung interessant, um die Datenübertragung im Internet zu beschleunigen. Bei großen Festplatten verliert die Dateigröße an Bedeutung, und die Datenbank ist nur für einen begrenzten Personenkreis bestimmt. Außerdem ist die Implementierung kostspielig, da sie zusätzliche Kenntnisse beim Programmierer und beim Benutzer erfordert.

Es stimmt, dass zip bei der Komprimierung, insbesondere von Text, rar deutlich unterlegen ist - was ein wenig schade ist.

 
Mikalas:

Wassilij!

Ist eine ZIP-Verpackung notwendig?

Ich glaube nicht, dass es das wert ist.

Ich denke anders.

Mikalas:

1. Wenn Sie eine Datenbank auf der Grundlage von ZIP erstellen wollen, ist dies nicht relevant.

MQ wird bald Standardfunktionen für die Arbeit mit Datenbanken hinzufügen (Renat hat eine Umfrage durchgeführt)

Nein, zip ist als Alternative zu DB nicht interessant. Deshalb lohnt es sich nicht, sich mit dem Reißverschluss zu befassen.

Mikalas:

2. Sie können das Problem nicht lösen, wenn die Dateigröße größer als uint ist.

Es muss eine ZIP64-Komprimierung für ulong size geben.

Ich habe nicht das Ziel, ein Analogon zu WinZip oder WinRar zu entwickeln. Nur die grundlegendsten Archive. Niemand denkt auch nur daran, Dateien zu komprimieren, die größer als 4 GB sind.

Mikalas:

3. Sie wissen nicht, wie genau die MT5-Daten komprimiert werden.

Es ist möglich, dass große Dateien (auch mit geringer Größe)

auch uint size) wird für HOUR komprimiert!

4. Um Dateien in ein Archiv zu "packen", müssen Sie eine ganze Reihe von Informationen in

eine Menge Informationen im Speicher - es wird HARDWARE geben!

Ich rate dringend von.... ab.

1) MQ führt keine langsamen Funktionen aus, und wenn doch, dann optimiert es sie rechtzeitig auf der Grundlage von Anfragen von Servicedesk. Ich bin irgendwie zuversichtlich, dass CryptEncode funktionieren wird.

2. Es wird keine Verlangsamungen geben. Sie wissen nicht, was ein modernes MQL5 an Leistung zu bieten hat. Die heutigen Computer haben zu viel Speicherplatz. Das Herunterladen und Packen einer Datei von ein paar hundert Megabyte ist ein Kinderspiel, und mehr braucht man nicht. Denn dies sind andere Aufgaben.

 
Mikalas:

Wassilij!

Ist eine ZIP-Verpackung notwendig?

Ich glaube nicht, dass es das wert ist.

Wussten Sie, dass die Implementierung von gezippten Dateien z.B. die Möglichkeit eröffnet, docx- und xmlx-Dateien zu erstellen, d.h. Sie können direkt aus Ihrem Expert Advisor eine Excel-Tabelle mit dem Bericht erstellen und diese z.B. per E-Mail versenden. Dabei handelt es sich um die Standardfunktionalität, ohne die Verwendung von DLLs. Solche Bibliotheken können als Teil von Marketplace-Produkten vertrieben werden. Dies ist nur ein Beispiel.
 
C-4:

Ich denke anders.

Nein, zip ist als Alternative zu DB nicht interessant. Das ist nicht der Grund, warum ich mich mit zip beschäftigen möchte.

Ich habe nicht das Ziel, ein Analogon zu WinZip oder WinRar zu entwickeln. Nur die grundlegendsten Archive. Niemand käme auf die Idee, Dateien zu komprimieren, die größer als 4 GB sind.

1) MQ führt keine langsamen Funktionen aus, und wenn doch, dann optimiert es ihre Arbeit rechtzeitig auf der Grundlage von Anfragen des Service Desks. Ich bin irgendwie zuversichtlich, dass CryptEncode funktionieren wird.

2. Es wird keine Verlangsamungen geben. Sie wissen nicht, was ein modernes MQL5 an Leistung zu bieten hat. Die heutigen Computer haben zu viel Speicherplatz. Das Herunterladen und Packen einer Datei von ein paar hundert Megabyte ist ein Kinderspiel, und mehr braucht man nicht. Denn dies sind andere Aufgaben.

Gott sei Dank!
 
-Aleks-:

Ich denke wahrscheinlich altmodisch, aber für mich ist die Archivierung interessant, um die Datenübertragung im Internet zu beschleunigen. Bei großen Festplatten verliert die Dateigröße an Bedeutung, und die Datenbank ist nur für einen begrenzten Personenkreis bestimmt. Außerdem ist die Implementierung kostspielig, da sie zusätzliche Kenntnisse beim Programmierer und beim Benutzer erfordert.

True zip ist bei der Komprimierung deutlich unterlegen, vor allem Text, rar - was ein wenig traurig ist.

Das ist richtig. Die Kommunikation mit einem Server eines Drittanbieters über WebRequest wird durch die Paketierung der gesendeten Informationen wesentlich schneller sein. Dies ist ein weiterer Grund, warum das Umladen der Verpackung eine gute Lösung ist.

-Aleks-:

Allerdings ist zip der Komprimierung von rar deutlich unterlegen, vor allem bei Text - was ein wenig schade ist.

Schätzen, was uns gegeben wurde. Glauben Sie mir, die Fähigkeit, mit dem gängigsten Kompressionsformat zu arbeiten, deckt 90 % aller Aufgaben ab. 80 % der Redundanz wird mit Zip erfolgreich beseitigt. Was dann kommt, ist die Jagd nach Papageien, die niemand braucht.

 
Mikalas:
Gut, dass wir ihn los sind!
Ich habe das Format der Standard-Zip-Datei untersucht. Es ist nicht kompliziert. Alles, was Sie tun müssen, um das Packen zu "lernen", ist, zwei zusätzliche Strukturen am Ende der Datei zu schreiben, ähnlich wie eine Header-Struktur. Die Mühe lohnt sich also ganz klar.