带有修改器CRYPT_ARCH_ZIP的CryptDecode - 如何使用? - 页 10

 

Vasiliy!

没有等来你的答复。(不知道MQ是否有时间在build 1100中实施变化)

解码器。

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


呼唤。

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

Vasiliy!

没有等来你的答复。(不知道MQ是否有时间在build 1100中实施变化)

解码器。

呼唤。

没有时间。在我们的讨论开始之前,已经介绍了《图片1100》。
 
-Aleks-:

Mikalas, 有没有可能把解码和编码代码做成一个库,并对解包完成情况进行检查?

是的,当然了。这就是我在不久的将来要做的事情。将会有包装/拆包。从档案中添加和删除文件。只要CryptDecode不失败。
 
C-4:
当然。这就是我在不久的将来要做的事情。将会有包装/拆包。从档案中添加和删除文件。最主要的是,CryptDecode不会失败。

Vasiliy!

ZIP包装有必要吗?

我认为这不值得。

1.如果你想建立一个基于ZIP的数据库,那就没有意义了。

很快,MQ将增加标准函数来与数据库一起工作(Renat做了一个调查)。

2.对于大于uint的文件大小,你无法解决这个问题。

对于ulong尺寸,应该有ZIP64压缩。

3.你不知道MT5数据到底是如何压缩的

大文件(甚至是uint大小)有可能会

大文件(即使是微不足道的大小)将被压缩数小时之久。

4.为了将文件 "塞进 "存档,你将不得不把相当多的信息保留在

记忆中的大量信息--会有HARDWARE!

我强烈建议不要这样做....

 

我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小 就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。

的确,zip在压缩方面比rar差很多,尤其是文本的压缩--这有点让人难过。

 
Mikalas:

Vasiliy!

ZIP包装有必要吗?

我认为这不值得。

我不这么认为。

Mikalas:

1.如果你想建立一个基于ZIP的数据库,那就没有意义了。

很快MQ就会增加与数据库合作的标准函数(Renat做了一个调查)。

不,作为DB的替代品,zip并不有趣。这不是它值得为拉链费心的原因。

Mikalas:

2.你无法解决文件大小大于uint的问题。

对于ulong大小,必须有ZIP64压缩。

我的目标不是要创建一个类似于WinZip或WinRar的软件。只有最基本的档案。甚至没有人会想到要压缩大于4GB的文件。

Mikalas:

3.你不知道MT5数据到底是如何压缩的。

大文件(甚至是uint大小)有可能会被删除。

甚至uint大小)将被压缩HOUR!

4.为了将文件 "塞进 "存档,你将不得不把相当多的信息保留在

记忆中的大量信息--会有HARDWARE!

我强烈建议反对....

1.MQ不做慢速功能,如果要做,它也会根据servicedesk的要求及时优化它们。我对CryptEncode 会飞起来有一定的信心。

2.不会有任何减速。你不知道现代MQL5在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。

 
Mikalas:

Vasiliy!

ZIP包装有必要吗?

我认为这不值得。

你知道吗,压缩文件的实施,例如,打开了创建docx和xmlx文件的途径。 这意味着,直接从你的专家顾问,你可以创建一个Excel电子表格的报告,并通过邮件发送,例如。这将只是标准功能,不使用DLLs。这种库可以作为Marketplace产品的一部分分发。这只是一个例子。
 
C-4:

我不这么认为。

不,作为DB的替代品,zip并不有趣。这不是它值得为拉链费心的原因。

我的目标不是要创建一个类似于WinZip或WinRar的软件。只有最基本的档案。甚至没有人会想到要压缩大于4GB的文件。

1.MQ不做慢速功能,如果做的话,它将根据服务台的要求及时优化他们的工作。我对CryptEncode会飞起来有一定的信心。

2.不会有任何减速。你不知道现代MQL5在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。

上帝保佑!
 
-Aleks-:

我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。

真正的zip在压缩方面明显逊色,尤其是文本,rar--这有点悲哀。

相当正确。通过WebRequest 与第三方服务器进行通信,使用发送信息的包装会更快。这是另一个想法,为什么重装包装是一个好的解决方案。

-Aleks-:

然而,zip在压缩方面明显不如rar,尤其是文本的压缩--这有点让人难过。

欣赏我们所得到的东西。相信我,使用最流行的压缩格式的能力涵盖了所有任务的90%。80%的冗余被成功地用拉链消除了。接下来是追逐鹦鹉,没有人需要。

 
Mikalas:
摆脱困境的好办法!
我调查了标准压缩文件的格式。这并不复杂。你要做的就是 "学习 "如何打包,在文件的末尾写两个额外的结构,类似于头文件结构。因此,这显然是值得努力的。