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

 
Mikalas:

解开标准的ZIP文件!

(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) )

谢谢你。这正是我所需要的!迈克尔,你做得非常好。我将在晚上开始着手解决这个问题。但仍然需要MQ的评论。
 
我的没有解压,但出现了内部错误(4024)。
 
Mikalas:

解开标准的ZIP文件!

(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) )

附上你解压的压缩文件。
 

所以他有自己的档案?

而且我很高兴 )

ZS:当然,即使只是他自己的,也已经很不错了。

 
sanyooooook:

所以他有自己的档案?

而且我很高兴 )

ZS:当然,即使只是他自己的,也已经很不错了。

我今天会试着去做。
附加的文件:
GAZR-6_15.zip  1 kb
 

Vasiliy!

到底有没有必要这样做呢?

 
Mikalas:

Vasiliy!

你到底要不要做?

还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他的档案,你的代码没有解压。

sanyooooook:
我在解压时遇到麻烦,导致内部错误(4024)。

s.s. 至少错误是不同的。

米卡拉斯

解压标准的ZIP文件!

(目前,档案中只有一个包装好的文件,然后我将对几个文件进行包装(如果需要) )

另一个问题。你用的是什么压缩器,你用的是什么参数(压缩率、字典大小)。
 
C-4:

还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他档案你的代码不解压。

s.s. 至少错误是不同的。

另一个问题。你用什么拉链存档器来创建存档,以及你使用了什么参数(压缩率、字典大小)。

使用默认设置的WinRar。

我知道如何解压所有的档案。

但要弄清楚MQ打包器的4个字节需要花点时间

如果需要的话,我会去做。

MQ可能不会回答:)

 

MQ打包器中的最后4个字节是哈希或CRC

(服务信息)。

但不清楚是打包数据还是原始数据。

我们将不得不等待MQ的回应。

 

在此期间,它是这样的。

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

呼叫功能

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

提取档案中的第二个文件(GAZR-6.15.dat)。该档案是由WinRar以标准设置制作的。

在函数GetFile()中的参数位置(1),对于准确识别ZIP档案中的文件是必要的。

归档文件可以包含具有相同名称的文件。

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