안녕하세요!
이 작업은 복잡한 객체 컬렉션 집합의 변경 순간을 추적하는 것입니다. 객체와 컬렉션을 문자열로 변환할 수 있는데, 컬렉션당 약 2000자가 될 것입니다. 이렇게 긴 문자열을 짧게 표현하는 데 어떤 라이브러리 함수가 더 정확한지 알려주시겠습니까?
- 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에 삽입했는데 오류가 발생하여"=" 하나를 제거하고 하나만 남기고 정상적으로 작동했습니다 (두 개의 등호가 있는 문자열을 만든 키가 무엇인지 재현할 수 없음).
나는 대답을 얻고 싶다, 어쩌면 내가 뭔가 잘못하고있을 수도있다!
추신 : 모든 코드를 첨부했는데 무엇이 문제 일 수 있습니까?문자열의 길이를 지정하지 않으면 StringToArray 함수는 종결 0을 캡처합니다(역사적으로).
따라서 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; //--- 수정 카운트 매개변수 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++]; //--- 음수 확인, 입력_배열은 서명 가능 if(input_sym>0 && input_sym<' ') continue; //--- 0은 터미네이터 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)); } //+------------------------------------------------------------------+
해시 함수 라이브러리 및 다른 숫자 체계로의 변환:
이 라이브러리에는 범용 해시 함수의 알고리즘인 adler32, CRC-32, MaHash8v64가 포함되어 있습니다. 또한 기본 시스템에서 십진수에서 문자열 표현으로 또는 그 반대로 변환하는 함수도 포함되어 있습니다.
Author: Aleksandr Chugunov