CRYPT_ARCH_ZIP değiştiricili CryptDecode - Nasıl kullanılır? - sayfa 6

 
Mikalas :

Standart ZIP dosyalarını açar!

(şimdiye kadar, arşivde yalnızca bir paketlenmiş dosya varken, o zaman birkaç tane yapacağım (gerekirse) )

Teşekkür ederim. Tam olarak ne gerekli! Michael, harikasın. Bu gece araştırmaya başlayacağım. Ancak MQ yorumlarına hala ihtiyaç var.
 
Ve bir şeyi açmadım, dahili bir hata verdim (4024)
 
Mikalas :

Standart ZIP dosyalarını açar!

(şimdiye kadar, arşivde yalnızca bir paketlenmiş dosya varken, o zaman birkaç tane yapacağım (gerekirse) )

Açtığınız zip dosyasını ekleyin.
 

yani dosyanın altında mı?

ve mutluydum)

Not: Şüphesiz, yalnızca sizinki zaten mükemmel olsa bile

 
sanyooooook :

yani dosyanın altında mı?

ve mutluydum)

Not: Şüphesiz, yalnızca sizinki zaten mükemmel olsa bile

bugün yapmaya çalışacağım
Dosyalar:
GAZR-6_15.zip  1 kb
 

Vasili!

Peki yapılmalı mı, yapılmamalı mı?

 
Mikalas :

Vasili!

Peki yapılmalı mı, yapılmamalı mı?

Henüz değil. Pazartesi MQ yorumlarını görelim. Alexander'ın gönderisine göre, konunun zip arşivinizde olduğu açık. Diğer arşivler Kodunuz paketini açmıyor:

sanyoooooook :
Ve bir şeyi açmadım, dahili bir hata verdim (4024)

ps iyi en azından hata farklı.

Mikalas :

Standart ZIP dosyalarını açar!

(şimdiye kadar, arşivde yalnızca bir paketlenmiş dosya varken, o zaman birkaç tane yapacağım (gerekirse) )

Bir soru daha. Arşivi oluşturmak için ne tür bir zip arşivi kullanıldı ve hangi parametreler kullanıldı (sıkıştırma oranı, sözlük boyutu).
 
C-4 :

Henüz değil. Pazartesi MQ yorumlarını görelim. Alexander'ın gönderisine göre, konunun zip arşivleyicinizde olduğu açık. Diğer arşivler Kodunuz paketini açmıyor:

ps iyi en azından hata farklı.

Bir soru daha. Arşivi oluşturmak için ne tür bir zip arşivi kullanıldı ve hangi parametreler kullanıldı (sıkıştırma oranı, sözlük boyutu).

Varsayılan ayarlarla WinRar.

Tüm arşivleri nasıl açacağımı biliyorum.

Ancak bunun için MQ paketleyicisinin 4 baytı hakkında biraz bilgi sahibi olmanız gerekir.

Gerekirse ben yaparım.

MQ cevap vermeyebilir :)

 

MQ paketleyicisindeki son 4 bayt bir karma veya CRC'dir

(servis bilgileri)

Ancak net, paketlenmiş veya ham veri değildir.

MQ'dan bir cevap beklememiz gerekecek.

 

O zamana kadar:

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

İşlev çağrısı:

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

Arşivdeki 2. dosyayı (GAZR-6.15.dat) çıkarır. Arşiv, WinRar tarafından varsayılan ayarlarla yapılır.

GetFile() işlevinde, ZIP arşivindeki dosyayı doğru bir şekilde tanımlamak için konum (1) parametresine ihtiyaç vardır.

Arşiv, AYNI adlara sahip dosyalar içerebilir.

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