CRYPT_ARCH_ZIP 수정자가 있는 CryptDecode - 사용 방법은 무엇입니까? - 페이지 10

 

바실리!

당신에게서 응답을 기대하지 않았습니다. (MQ가 빌드 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 :

바실리!

당신에게서 응답을 기대하지 않았습니다. (MQ가 빌드 1100에서 변경 사항을 구현했는지 모르겠습니다)

디코더:

도전 과제:

시간이 없었다. Build 1100은 논의가 시작되기 전에 소개되었습니다.
 
-Aleks- :

미칼라스님 , 언박싱의 끝을 확인하면서 디코딩 및 인코딩 코드를 라이브러리 형태로 만들 수 있나요?

틀림없이. 이것이 내가 가까운 장래에 할 일입니다. 포장/풀기 작업이 진행됩니다. 아카이브에서 파일 추가 및 제거. 중요한 것은 CryptDecode가 실패하지 않는다는 것입니다.
 
C-4 :
틀림없이. 이것이 내가 가까운 장래에 할 일입니다. 포장/풀기 작업이 진행됩니다. 아카이브에서 파일 추가 및 제거. 중요한 것은 CryptDecode가 실패하지 않는다는 것입니다.

바실리!

ZIP 포장이 필요하십니까?

그럴 가치가 없다고 생각합니다.

1. ZIP을 기반으로 데이터베이스를 구축하려는 경우 관련이 없습니다.

곧 MQ는 데이터베이스 작업을 위한 표준 기능을 추가할 것입니다(Renat이 설문조사를 수행함)

2. uint보다 큰 파일 은 문제를 해결할 수 없습니다.

ulong 크기의 경우 압축은 ZIP64여야 합니다.

3. MT5 데이터가 어떻게 압축되는지 모른다

아마도 큰 파일(단위 크기라도)은

압축 시간!

4. 파일을 아카이브에 "밀어넣으려면"

메모리에는 많은 정보가 있습니다. BRAKES가 있을 것입니다!

정말 추천하지 않습니다...

 

아마도 구식 방식으로 생각할 수 있지만 인터넷에서 데이터 전송 속도를 높이는 데 있어 아카이빙은 흥미롭습니다. 로컬에서 대용량 하드 드라이브 를 사용하면 파일 크기 가 관련성을 잃고 데이터베이스는 제한된 사람들을 위한 것이며 프로그래머와 사용자의 추가 지식이 필요하기 때문에 구현하는 데 비용이 많이 듭니다.

사실, zip은 압축, 특히 텍스트에서 rar에 비해 상당히 열등합니다. 이는 약간 슬픈 일입니다.

 
Mikalas :

바실리!

ZIP 포장이 필요합니까?

그럴 가치가 없다고 생각합니다.

나는 그렇지 않다고 생각한다.

미칼라스 :

1. ZIP을 기반으로 데이터베이스를 구축하려는 경우 관련이 없습니다.

곧 MQ는 데이터베이스 작업을 위한 표준 기능을 추가할 것입니다(Renat이 설문조사를 수행함)

아니오, zip은 데이터베이스의 대안으로 흥미롭지 않습니다. 그렇기 때문에 번거롭게 포장할 가치가 없습니다.

미칼라스 :

2. uint보다 큰 파일은 문제를 해결할 수 없습니다.

ulong 크기의 경우 압축은 ZIP64여야 합니다.

나는 WinZip 또는 WinRar의 유사체를 만들 목표가 없습니다. 가장 기본적인 아카이브만 있습니다. 아무도 4GB보다 큰 파일을 패킹할 생각조차 하지 않을 것입니다.

미칼라스 :

3. MT5 데이터가 어떻게 압축되는지 모른다

아마도 큰 파일(단위 크기라도)은

압축 시간!

4. 파일을 아카이브에 "밀어넣으려면"

메모리에는 많은 정보가 있습니다. BRAKES가 있을 것입니다!

정말 추천하지 않습니다...

1. MQ는 느린 기능을 만들지 않으며, 그렇게 하면 서비스 데스크의 요청에 따라 적시에 작업을 최적화합니다. 어떤 이유로 CryptEncode 가 날아갈 것이라고 확신합니다.

2. 브레이크가 없을 것입니다. 최신 MQL5가 성능 면에서 무엇을 할 수 있는지 모릅니다. 현대 컴퓨터의 메모리는 먼지와 같습니다. 수백 메가바이트의 파일을 업로드하고 압축하는 것은 사소한 일이지만 더 이상 필요하지 않습니다. 다른 것들이기 때문입니다.

 
Mikalas :

바실리!

ZIP 포장이 필요하십니까?

그럴 가치가 없다고 생각합니다.

예를 들어, 압축 파일을 zip으로 구현하면 docx 및 xmlx 파일을 생성할 수 있다는 사실을 알고 계셨습니까? 즉, Expert Advisor에서 직접 보고서를 사용하여 Excel 스프레드시트를 만들어 예를 들어 메일로 보낼 수 있습니다. 이 경우 DLL을 사용하지 않고 일반 기능에 대해서만 설명합니다. 이러한 라이브러리는 시장 제품의 일부로 배포될 수 있습니다. 이것은 하나의 예일 뿐입니다.
 
C-4 :

나는 그렇지 않다고 생각한다.

아니오, zip은 데이터베이스의 대안으로 흥미롭지 않습니다. 그렇기 때문에 번거롭게 포장할 가치가 없습니다.

나는 WinZip 또는 WinRar의 유사체를 만들 목표가 없습니다. 가장 기본적인 아카이브 만. 아무도 4GB보다 큰 파일을 패킹할 생각조차 하지 않을 것입니다.

1. MQ는 느린 기능을 만들지 않으며, 그렇게 하면 서비스 데스크의 요청에 따라 적시에 작업을 최적화합니다. 어떤 이유로 CryptEncode가 날아갈 것이라고 확신합니다.

2. 브레이크가 없을 것입니다. 최신 MQL5가 성능 면에서 무엇을 할 수 있는지 모릅니다. 현대 컴퓨터의 메모리는 먼지와 같습니다. 수백 메가바이트의 파일을 업로드하고 압축하는 것은 사소한 일이지만 더 이상 필요하지 않습니다. 그것들은 다른 문제이기 때문입니다.

행운을 빕니다!
 
-Aleks- :

아마도 구식 방식으로 생각할 수 있지만 인터넷에서 데이터 전송 속도를 높이는 데 있어 아카이빙은 흥미롭습니다. 로컬에서 대용량 하드 드라이브를 사용하면 파일 크기가 관련성을 상실하고 데이터베이스는 제한된 사람들을 위한 것이며 프로그래머와 사용자의 추가 지식이 필요하기 때문에 구현 비용이 많이 듭니다.

사실, zip은 압축, 특히 텍스트에서 rar에 비해 상당히 열등합니다. 이는 약간 슬픈 일입니다.

제대로 했어. 전송된 정보의 패키징을 사용하여 WebRequest 를 통해 타사 서버와 훨씬 빠르게 통신할 수 있습니다. 이것은 상자를 다시 시작하는 것이 옳은 일인 또 다른 아이디어입니다.

-알렉스 -:

사실, zip은 압축, 특히 텍스트에서 rar에 비해 상당히 열등합니다. 이는 약간 슬픈 일입니다.

그들이 우리에게 준 것에 감사하십시오. 가장 일반적인 압축 형식으로 작업하는 기능은 모든 작업의 90%를 처리합니다. Zip은 중복의 80%를 성공적으로 제거합니다. 다음은 아무도 필요로 하지 않는 앵무새의 추적입니다.

 
Mikalas :
행운을 빕니다!
표준 zip 파일 형식을 조사했습니다. 그는 복잡하지 않습니다. 패킹하는 방법을 "배우려면" 파일 끝에 헤더 구조와 유사한 두 개의 추가 구조를 작성하는 것으로 충분합니다. 따라서 이 게임은 분명히 양초의 가치가 있습니다.
사유: