带有修改器CRYPT_ARCH_ZIP的CryptDecode - 如何使用? - 页 6 12345678910 新评论 Vasiliy Sokolov 2015.03.29 08:13 #51 Mikalas:解开标准的ZIP文件!(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) ) 谢谢你。这正是我所需要的!迈克尔,你做得非常好。我将在晚上开始着手解决这个问题。但仍然需要MQ的评论。 Alexandr Bryzgalov 2015.03.29 08:18 #52 我的没有解压,但出现了内部错误(4024)。 Vasiliy Sokolov 2015.03.29 08:28 #53 Mikalas:解开标准的ZIP文件!(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) ) 附上你解压的压缩文件。 Alexandr Bryzgalov 2015.03.29 08:33 #54 所以他有自己的档案?而且我很高兴 )ZS:当然,即使只是他自己的,也已经很不错了。 Mikhail Filimonov 2015.03.29 14:52 #55 sanyooooook:所以他有自己的档案?而且我很高兴 )ZS:当然,即使只是他自己的,也已经很不错了。 我今天会试着去做。 附加的文件: GAZR-6_15.zip 1 kb Mikhail Filimonov 2015.03.29 16:10 #56 Vasiliy!到底有没有必要这样做呢? Vasiliy Sokolov 2015.03.29 16:25 #57 Mikalas:Vasiliy!你到底要不要做?还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他的档案,你的代码没有解压。sanyooooook: 我在解压时遇到麻烦,导致内部错误(4024)。s.s. 至少错误是不同的。 米卡拉斯。解压标准的ZIP文件!(目前,档案中只有一个包装好的文件,然后我将对几个文件进行包装(如果需要) ) 另一个问题。你用的是什么压缩器,你用的是什么参数(压缩率、字典大小)。 Mikhail Filimonov 2015.03.29 16:34 #58 C-4:还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他档案你的代码不解压。s.s. 至少错误是不同的。 另一个问题。你用什么拉链存档器来创建存档,以及你使用了什么参数(压缩率、字典大小)。使用默认设置的WinRar。我知道如何解压所有的档案。但要弄清楚MQ打包器的4个字节需要花点时间如果需要的话,我会去做。MQ可能不会回答:) Mikhail Filimonov 2015.03.29 17:37 #59 MQ打包器中的最后4个字节是哈希或CRC(服务信息)。但不清楚是打包数据还是原始数据。我们将不得不等待MQ的回应。 Mikhail Filimonov 2015.03.29 18:25 #60 在此期间,它是这样的。//+------------------------------------------------------------------+ //| 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 12345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
解开标准的ZIP文件!
(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) )
解开标准的ZIP文件!
(目前,档案中只有一个打包的文件,以后我将为多个文件打包(如果需要) )
所以他有自己的档案?
而且我很高兴 )
ZS:当然,即使只是他自己的,也已经很不错了。
所以他有自己的档案?
而且我很高兴 )
ZS:当然,即使只是他自己的,也已经很不错了。
Vasiliy!
到底有没有必要这样做呢?
Vasiliy!
你到底要不要做?
还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他的档案,你的代码没有解压。
我在解压时遇到麻烦,导致内部错误(4024)。
s.s. 至少错误是不同的。
解压标准的ZIP文件!
(目前,档案中只有一个包装好的文件,然后我将对几个文件进行包装(如果需要) )
还没有。我们将在周一看到MQ的评论。从亚历山大的帖子中可以看出,这是你的zip-archiver。其他档案你的代码不解压。
s.s. 至少错误是不同的。
另一个问题。你用什么拉链存档器来创建存档,以及你使用了什么参数(压缩率、字典大小)。使用默认设置的WinRar。
我知道如何解压所有的档案。
但要弄清楚MQ打包器的4个字节需要花点时间
如果需要的话,我会去做。
MQ可能不会回答:)
MQ打包器中的最后4个字节是哈希或CRC
(服务信息)。
但不清楚是打包数据还是原始数据。
我们将不得不等待MQ的回应。
在此期间,它是这样的。
呼叫功能。
提取档案中的第二个文件(GAZR-6.15.dat)。该档案是由WinRar以标准设置制作的。
在函数GetFile()中的参数位置(1),对于准确识别ZIP档案中的文件是必要的。
归档文件可以包含具有相同名称的文件。