带有修改器CRYPT_ARCH_ZIP的CryptDecode - 如何使用? - 页 10 1...345678910 新评论 Mikhail Filimonov 2015.04.01 22:57 #91 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 ); } Vasiliy Sokolov 2015.04.02 10:46 #92 Mikalas:Vasiliy!没有等来你的答复。(不知道MQ是否有时间在build 1100中实施变化)解码器。呼唤。 没有时间。在我们的讨论开始之前,已经介绍了《图片1100》。 Vasiliy Sokolov 2015.04.02 10:47 #93 -Aleks-:Mikalas, 有没有可能把解码和编码代码做成一个库,并对解包完成情况进行检查? 是的,当然了。这就是我在不久的将来要做的事情。将会有包装/拆包。从档案中添加和删除文件。只要CryptDecode不失败。 Mikhail Filimonov 2015.04.02 15:19 #94 C-4: 当然。这就是我在不久的将来要做的事情。将会有包装/拆包。从档案中添加和删除文件。最主要的是,CryptDecode不会失败。Vasiliy!ZIP包装有必要吗?我认为这不值得。1.如果你想建立一个基于ZIP的数据库,那就没有意义了。很快,MQ将增加标准函数来与数据库一起工作(Renat做了一个调查)。2.对于大于uint的文件大小,你无法解决这个问题。对于ulong尺寸,应该有ZIP64压缩。3.你不知道MT5数据到底是如何压缩的大文件(甚至是uint大小)有可能会大文件(即使是微不足道的大小)将被压缩数小时之久。4.为了将文件 "塞进 "存档,你将不得不把相当多的信息保留在记忆中的大量信息--会有HARDWARE!我强烈建议不要这样做.... Aleksey Vyazmikin 2015.04.02 20:05 #95 我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小 就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。的确,zip在压缩方面比rar差很多,尤其是文本的压缩--这有点让人难过。 Vasiliy Sokolov 2015.04.03 15:57 #96 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在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。 Vasiliy Sokolov 2015.04.03 16:01 #97 Mikalas:Vasiliy!ZIP包装有必要吗?我认为这不值得。 你知道吗,压缩文件的实施,例如,打开了创建docx和xmlx文件的途径。 这意味着,直接从你的专家顾问,你可以创建一个Excel电子表格的报告,并通过邮件发送,例如。这将只是标准功能,不使用DLLs。这种库可以作为Marketplace产品的一部分分发。这只是一个例子。 Mikhail Filimonov 2015.04.03 16:01 #98 C-4:我不这么认为。不,作为DB的替代品,zip并不有趣。这不是它值得为拉链费心的原因。我的目标不是要创建一个类似于WinZip或WinRar的软件。只有最基本的档案。甚至没有人会想到要压缩大于4GB的文件。1.MQ不做慢速功能,如果做的话,它将根据服务台的要求及时优化他们的工作。我对CryptEncode会飞起来有一定的信心。2.不会有任何减速。你不知道现代MQL5在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。 上帝保佑! Vasiliy Sokolov 2015.04.03 16:07 #99 -Aleks-:我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。真正的zip在压缩方面明显逊色,尤其是文本,rar--这有点悲哀。相当正确。通过WebRequest 与第三方服务器进行通信,使用发送信息的包装会更快。这是另一个想法,为什么重装包装是一个好的解决方案。-Aleks-: 然而,zip在压缩方面明显不如rar,尤其是文本的压缩--这有点让人难过。欣赏我们所得到的东西。相信我,使用最流行的压缩格式的能力涵盖了所有任务的90%。80%的冗余被成功地用拉链消除了。接下来是追逐鹦鹉,没有人需要。 Vasiliy Sokolov 2015.04.03 16:10 #100 Mikalas: 摆脱困境的好办法! 我调查了标准压缩文件的格式。这并不复杂。你要做的就是 "学习 "如何打包,在文件的末尾写两个额外的结构,类似于头文件结构。因此,这显然是值得努力的。 1...345678910 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
Vasiliy!
没有等来你的答复。(不知道MQ是否有时间在build 1100中实施变化)
解码器。
呼唤。
Vasiliy!
没有等来你的答复。(不知道MQ是否有时间在build 1100中实施变化)
解码器。
呼唤。
Mikalas, 有没有可能把解码和编码代码做成一个库,并对解包完成情况进行检查?
当然。这就是我在不久的将来要做的事情。将会有包装/拆包。从档案中添加和删除文件。最主要的是,CryptDecode不会失败。
Vasiliy!
ZIP包装有必要吗?
我认为这不值得。
1.如果你想建立一个基于ZIP的数据库,那就没有意义了。
很快,MQ将增加标准函数来与数据库一起工作(Renat做了一个调查)。
2.对于大于uint的文件大小,你无法解决这个问题。
对于ulong尺寸,应该有ZIP64压缩。
3.你不知道MT5数据到底是如何压缩的
大文件(甚至是uint大小)有可能会
大文件(即使是微不足道的大小)将被压缩数小时之久。
4.为了将文件 "塞进 "存档,你将不得不把相当多的信息保留在
记忆中的大量信息--会有HARDWARE!
我强烈建议不要这样做....
我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小 就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。
的确,zip在压缩方面比rar差很多,尤其是文本的压缩--这有点让人难过。
Vasiliy!
ZIP包装有必要吗?
我认为这不值得。
我不这么认为。
1.如果你想建立一个基于ZIP的数据库,那就没有意义了。
很快MQ就会增加与数据库合作的标准函数(Renat做了一个调查)。
不,作为DB的替代品,zip并不有趣。这不是它值得为拉链费心的原因。
2.你无法解决文件大小大于uint的问题。
对于ulong大小,必须有ZIP64压缩。
我的目标不是要创建一个类似于WinZip或WinRar的软件。只有最基本的档案。甚至没有人会想到要压缩大于4GB的文件。
3.你不知道MT5数据到底是如何压缩的。
大文件(甚至是uint大小)有可能会被删除。
甚至uint大小)将被压缩HOUR!
4.为了将文件 "塞进 "存档,你将不得不把相当多的信息保留在
记忆中的大量信息--会有HARDWARE!
我强烈建议反对....
1.MQ不做慢速功能,如果要做,它也会根据servicedesk的要求及时优化它们。我对CryptEncode 会飞起来有一定的信心。
2.不会有任何减速。你不知道现代MQL5在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。
Vasiliy!
ZIP包装有必要吗?
我认为这不值得。
我不这么认为。
不,作为DB的替代品,zip并不有趣。这不是它值得为拉链费心的原因。
我的目标不是要创建一个类似于WinZip或WinRar的软件。只有最基本的档案。甚至没有人会想到要压缩大于4GB的文件。
1.MQ不做慢速功能,如果做的话,它将根据服务台的要求及时优化他们的工作。我对CryptEncode会飞起来有一定的信心。
2.不会有任何减速。你不知道现代MQL5在性能方面的能力。今天的计算机有太多的内存。要下载和打包一个几百兆的文件是小菜一碟,你不需要更多。因为这些是其他的任务。
我的想法可能很老套,但对我来说,归档对加快互联网上的数据传输很有意思。在本地有大的硬盘,文件大小就失去了意义,数据库将为有限的人服务,而且实施起来成本很高,因为它需要程序员和用户的额外知识。
真正的zip在压缩方面明显逊色,尤其是文本,rar--这有点悲哀。
相当正确。通过WebRequest 与第三方服务器进行通信,使用发送信息的包装会更快。这是另一个想法,为什么重装包装是一个好的解决方案。
然而,zip在压缩方面明显不如rar,尤其是文本的压缩--这有点让人难过。
欣赏我们所得到的东西。相信我,使用最流行的压缩格式的能力涵盖了所有任务的90%。80%的冗余被成功地用拉链消除了。接下来是追逐鹦鹉,没有人需要。
摆脱困境的好办法!