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

 

Vasili!

Senden bir cevap beklemiyordum. (MQ'nun yapı 1100'deki değişiklikleri uygulamayı başardığını bilmiyorum)

kod çözücü:

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


Zorluklar:

 //+------------------------------------------------------------------+
//|                                                     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 :

Vasili!

Senden bir cevap beklemiyordum. (MQ'nun yapı 1100'deki değişiklikleri uygulamayı başardığını bilmiyorum)

kod çözücü:

Zorluklar:

Zaman yoktu. Build 1100, tartışmamız başlamadan önce tanıtıldı.
 
-Aleks- :

Mikalas , kutudan çıkarmanın sonunu kontrol ederek kod çözme ve kodlama kodunu kütüphane şeklinde yapmak mümkün müdür?

Kesinlikle. Yakın gelecekte yapacağım şey bu. Paketleme/açma olacak. Arşive dosya ekleme ve çıkarma. Ana şey, CryptDecode'un başarısız olmamasıdır.
 
C-4 :
Kesinlikle. Yakın gelecekte yapacağım şey bu. Paketleme/açma olacak. Arşive dosya ekleme ve çıkarma. Ana şey, CryptDecode'un başarısız olmamasıdır.

Vasili!

ZIP ambalajına mı ihtiyacınız var?

Buna değer olduğunu düşünmüyorum.

1. ZIP'ye dayalı bir veritabanı oluşturmak istiyorsanız, bu önemli olmayacaktır.

Yakında MQ, veritabanıyla çalışmak için standart işlevler ekleyecektir (Renat bir anket yaptı)

2. uint'ten büyük dosyalarla sorunu çözemezsiniz.

Ulong boyutları için sıkıştırma ZIP64 olmalıdır.

3. MT5 verilerinin nasıl sıkıştırıldığını bilmiyorsunuz

Belki büyük dosyalar (uint boyutunda bile)

SAAT sıkıştır!

4. Dosyaları arşive "taşımak" için

hafızada çok fazla bilgi var - FRENLER olacak!

gerçekten tavsiye etmem...

 

Muhtemelen eski moda bir yol düşünüyorum, ancak internette veri aktarımını hızlandırmak için arşivlemek benim için ilginç. Yerel olarak, büyük sabit disklerle dosya boyutu alaka düzeyini kaybeder ve veritabanı sınırlı bir insan çevresi için olacaktır ve programcı ve kullanıcıdan ek bilgi gerektireceğinden uygulanması pahalı olacaktır.

Doğru, zip sıkıştırmada, özellikle metinde, rar'dan önemli ölçüde daha düşüktür - bu biraz üzücü.

 
Mikalas :

Vasili!

ZIP ambalajına mı ihtiyacınız var?

Buna değer olduğunu düşünmüyorum.

Ben aksini düşünüyorum.

Mikalas :

1. ZIP'ye dayalı bir veritabanı oluşturmak istiyorsanız, bu önemli olmayacaktır.

Yakında MQ, veritabanıyla çalışmak için standart işlevler ekleyecektir (Renat bir anket yaptı)

Hayır, zip bir veritabanına alternatif olarak ilgi çekici değildir. Bu yüzden paketleme ile uğraşmaya değmez.

Mikalas :

2. uint'ten büyük dosyalarla sorunu çözemezsiniz.

Ulong boyutları için sıkıştırma ZIP64 olmalıdır.

WinZip veya WinRar'ın bir benzerini yaratmak gibi bir amacım yok. Sadece en temel arşivler. Hiç kimse 4 GB'den büyük dosyaları paketlemeyi düşünmez bile.

Mikalas :

3. MT5 verilerinin nasıl sıkıştırıldığını bilmiyorsunuz

Belki büyük dosyalar (uint boyutunda bile)

SAAT sıkıştır!

4. Dosyaları arşive "taşımak" için

hafızada çok fazla bilgi var - FRENLER olacak!

gerçekten tavsiye etmem...

1. MQ, yavaş işlevler yapmaz ve yapıyorsa, hizmet masasından gelen talepler üzerine çalışmalarını zamanında optimize eder. Nedense CryptEncode'un uçacağından eminim.

2. Fren olmayacak. Modern MQL5'in performans açısından neler yapabileceğini bilmiyorsunuz. Modern bilgisayarlarda bellek kir gibidir. Birkaç yüz megabaytlık bir dosyanın yüklenmesi ve paketlenmesi önemsiz bir meseledir ve daha fazlası gerekli değildir. Çünkü bunlar başka konular.

 
Mikalas :

Vasili!

ZIP ambalajına mı ihtiyacınız var?

Buna değer olduğunu düşünmüyorum.

Örneğin, dosyaları zip'te paketlemenin uygulanmasının docx ve xmlx dosyaları oluşturmanın yolunu açacağını biliyor muydunuz? Bu, doğrudan Uzman Danışmanınızdan bir rapor içeren bir Excel elektronik tablosu oluşturabileceğiniz ve bunu örneğin posta yoluyla gönderebileceğiniz anlamına gelir. Bu durumda, DLL kullanmadan yalnızca normal işlevsellik hakkında konuşacağız. Bu tür kütüphaneler, pazar ürünlerinin bir parçası olarak dağıtılabilir. Ve bu sadece bir örnek.
 
C-4 :

Aksini düşünüyorum.

Hayır, zip bir veritabanına alternatif olarak ilgi çekici değildir. Bu yüzden paketleme ile uğraşmaya değmez.

WinZip veya WinRar'ın bir benzerini yaratmak gibi bir amacım yok. Sadece en temel arşivler. Hiç kimse 4 GB'den büyük dosyaları paketlemeyi düşünmez bile.

1. MQ, yavaş işlevler yapmaz ve yapıyorsa, hizmet masasından gelen talepler üzerine çalışmalarını zamanında optimize eder. Nedense CryptEncode'un uçacağından eminim.

2. Fren olmayacak. Modern MQL5'in performans açısından neler yapabileceğini bilmiyorsunuz. Modern bilgisayarlarda bellek kir gibidir. Birkaç yüz megabaytlık bir dosyayı yüklemek ve paketlemek önemsiz bir meseledir, ancak daha fazlasına ihtiyacınız yok. Çünkü bunlar başka konular.

İyi şanlar!
 
-Aleks- :

Muhtemelen eski moda bir yol düşünüyorum, ancak internette veri aktarımını hızlandırmak için arşivlemek benim için ilginç. Yerel olarak, büyük sabit disklerle dosya boyutu alaka düzeyini kaybeder ve veritabanı sınırlı bir insan çevresi için olacaktır ve programcı ve kullanıcıdan ek bilgi gerektireceğinden uygulanması pahalı olacaktır.

Doğru, zip sıkıştırmada, özellikle metinde, rar'dan önemli ölçüde daha düşüktür - bu biraz üzücü.

Doğru yaptı. Gönderilen bilgilerin paketlenmesi sayesinde WebRequest üzerinden üçüncü taraf bir sunucu ile çok daha hızlı iletişim kurmak mümkün olacaktır. Bu, bir kutuyu yeniden başlatmanın neden yapılacak doğru şey olduğuna dair başka bir fikir.

-Aleks- :

Doğru, zip sıkıştırmada, özellikle metinde, rar'dan önemli ölçüde daha düşüktür - bu biraz üzücü.

Bize verdiklerini takdir edin. İnanın bana, en yaygın sıkıştırma formatı ile çalışma yeteneği, tüm görevlerin %90'ını kapsar. Zip, fazlalığın %80'ini oldukça başarılı bir şekilde ortadan kaldırır. Ardından, kimsenin ihtiyaç duymadığı papağan arayışı gelir.

 
Mikalas :
İyi şanlar!
Standart zip dosya biçimini araştırdım. O karmaşık değil. Paketlemeyi "öğrenmek" için dosyanın sonuna başlık yapısına benzer iki ek yapı yazmak yeterlidir. Bu nedenle, oyun açıkça muma değer.