こんにちは!
タスクは、複雑なオブジェクトのコレクションの変化の瞬間を追跡することです。私はオブジェクトとコレクションを文字列に変換することができます。このような長い文字列を 短く表現するには、どのライブラリ関数がより正しいか教えてください。
- www.mql5.com
エラーCryptDecode(CRYPT_BASE64)
int OnInit() { string text=""; string res=""; string key="fuyTkH3cd63K9Htrl2xdFgjerPjmla8h"; text="indicator_chart_window"; if(!CryptEncodeA(text,key,res)) Print("Error: Encode:",GetLastError()); Print(res); text="vj9jDk+GxxB4W1zQc4/rC4OPvttMcgcF5ZFVC7m7l50="; if(!CryptDecodeA(text,key,res)) Print("Error: Decode:",GetLastError()); Print(res); return(INIT_SUCCEEDED); } //------------------------------------------------------------------ bool CryptEncodeA(string InputText,string key,string &Output) { uchar scr[]; uchar dst[]; uchar res[]; uchar key_aes256[]; uchar key_base64[]; StringToCharArray(InputText,scr); StringToCharArray(key,key_aes256); if(CryptEncode(CRYPT_AES256,scr,key_aes256,dst)==0) return(false); if(CryptEncode(CRYPT_BASE64,dst,key_base64,res)==0) return(false); Output = CharArrayToString(res); return(true); } //-- bool CryptDecodeA(string InputText,string key,string &Output) { uchar scr[]; uchar dst[]; uchar res[]; uchar key_base64[]; uchar key_aes256[]; StringToCharArray(InputText,scr); StringToCharArray(key,key_aes256); if(CryptDecode(CRYPT_BASE64,scr,key_base64,dst)==0) return(false); if(CryptDecode(CRYPT_AES256,dst,key_aes256,res)==0) return(false); Output = CharArrayToString(res); return(true); }
---
CryptEncodeA 関数は文字列を 作成 し、その後CryptDecodeAは 復号化 できず 、mt4では "4029"、mt5では "4006 "というエラーを出す。端末は自分では復号化できない暗号化をしている。
ログの行: vj9jDk+GxxB4W1zQc4/rC4OPvttMcgcF5ZFVC7m7l50=
最後の「=」を削除すると、復号化され、エラーは発生しない。
同時に、phpは正常にデコードされます:
$secret_key = 'fuyTkH3cd63K9Htrl2xdFgjerPjmla8h'; $s = "indicator_chart_window"; $res = base64_encode(openssl_encrypt($s,"AES-256-ECB",$secret_key,OPENSSL_RAW_DATA)); echo $res.'<br>'; $s= "vj9jDk+GxxB4W1zQc4/rC54fEtkLAsAONkyeprqmMlw="; $res = openssl_decrypt(base64_decode($s),"AES-256-ECB",$secret_key,OPENSSL_ZERO_PADDING|OPENSSL_RAW_DATA); echo $res;
---
同じ文字列をサーバー上で暗号化します:「indicator_chart_window"。
結果を取得:"vj9jDk+GxxB4W1zQc4/rC54fEtkLAsAONkyeprqmMlw=""
この行をmqlコードに挿入すると、またエラーが発生する。
---
サーバー上の文字列は次のようになります:"8CpXr3OlVhGs41syHA0+HqZKnatswQjRWn2fKYN4qN4=="
この文字列をmql-codeに挿入したところ、エラーが発生した。"="を1つだけ残して削除 したところ、 問題なく動作した(等号が2つある文字列を作成するキーは何だったのか、再現できなかった)。
何か間違ったことをしているのかもしれません!
追伸:すべてのコードを添付しました。StringToArray関数は、文字列の長さを指定しなかった場合(歴史的に)終端ゼロをキャプチャします。
したがって、 CryptDecodeA 関数では
StringToCharArray(InputText,scr,0,StringLen(InputText));
の代わりに
StringToCharArray(InputText,scr);
- www.mql5.com
さまざまなバリエーションでチェックしてみたが、すべてうまくいった。
一つ問題が残っている:
StringReplace(res,"\x00..\x1F",""); // Не помогает
印刷されていない文字を削除するには?
ありがとう!
MQLには必要な機能を持つ関数はありません。
配列を文字列に変換する前に行う方が簡単です:
//+------------------------------------------------------------------+ //|ArrayToString.mq5 //| Copyright 2021, MetaQuotes Software Corp. //|https://www.mql5.com //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ template<typename TChar> string ArrayToString(const TChar &input_array[],bool remove_non_printable=false,int start=0,int count=-1,int codepage=CP_ACP) { struct cvt { static string convert(const uchar &input_array[],int start=0,int count=-1,int codepage=CP_ACP) { return(CharArrayToString(input_array,start,count,codepage)); } static string convert(const short &input_array[],int start=0,int count=-1,int codepage=CP_ACP) { return(ShortArrayToString(input_array,start,count)); } }; int input_size =ArraySize(input_array); //--- 変換するデータがない if(start>=input_size || count==0) return(NULL); //--- 開始パラメータを修正する if(start<0) start=0; //--- countパラメータを修正する if(count<0 || count==WHOLE_ARRAY || (start+count)>input_size) count=input_size-start; //--- 入力配列をそのまま変換する if(!remove_non_printable) return(cvt::convert(input_array,start,count,codepage)); //--- 入力配列から印刷不可能な記号を取り除く TChar cvt_array[]; int cvt_size=0; if(!ArrayResize(cvt_array,input_size)) return(NULL); for(int i=0,n=start; i<input_size; i++) { const TChar input_sym = input_array[n++]; //--- 負のチェック、input_arrayは符号付きでも可 if(input_sym>0 && input_sym<' ') continue; //--- ゼロはターミネーター if(input_sym==0) break; //--- 入力シンボルをコピーする cvt_array[cvt_size++]=input_sym; } //--- クリーンアップされた配列を文字列に変換する return(cvt::convert(cvt_array,0,cvt_size)); } //+------------------------------------------------------------------+ //| スクリプト番組開始機能| //+------------------------------------------------------------------+ void OnStart() { uchar input_array_uc[]= { 1, 'T', 2, 'h', 3, 'e', 4, ' ', 5, 'q', 6, 'u', 7, 'i', 8, 'c', 9, 'k', 10, ' ', 11, 'b', 12, 'r', 13, 'o', 14, 'w', 15, 'n', 16, ' ', 15, 'f', 16, 'o', 17, 'x', 18, ' ', 19, 'j', 20, 'u', 21, 'm', 22, 'p', 23, 's', 24, ' ', 25, 'o', 26, 'v', 27, 'e', 28, 'r', 29, ' ', 30, 't', 31, 'h','e',' ','l','a','z','y',' ','d','o','g','.', 0, 'X', 'X', 'X', 'X', 'X', 'X' }; short input_array_s []= { 1, 'T', 2, 'h', 3, 'e', 4, ' ', 5, 'q', 6, 'u', 7, 'i', 8, 'c', 9, 'k', 10, ' ', 11, 'b', 12, 'r', 13, 'o', 14, 'w', 15, 'n', 16, ' ', 15, 'f', 16, 'o', 17, 'x', 18, ' ', 19, 'j', 20, 'u', 21, 'm', 22, 'p', 23, 's', 24, ' ', 25, 'o', 26, 'v', 27, 'e', 28, 'r', 29, ' ', 30, 't', 31, 'h','e',' ','l','a','z','y',' ','d','o','g','.', 0, 'X', 'X', 'X', 'X', 'X', 'X' }; Print("without removing non-printables"); Print(ArrayToString(input_array_uc)); Print(ArrayToString(input_array_s)); Print("with removing non-printables"); Print(ArrayToString(input_array_uc,true)); Print(ArrayToString(input_array_s,true)); } //+------------------------------------------------------------------+
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
ハッシュ関数ライブラリ:
作者: Aleksandr Chugunov