Guten Tag!
Die Aufgabe ist es, die Momente der Veränderung einer Reihe von Sammlungen komplexer Objekte zu verfolgen. Ich kann ein Objekt und eine Sammlung in eine Zeichenkette umwandeln, es werden etwa 2000 Zeichen pro Sammlung sein. Können Sie mir sagen, welche Bibliotheksfunktion am besten geeignet ist, um eine kurze Darstellung eines so langen Strings zu erhalten?
- www.mql5.com
Guten Tag!
Die Aufgabe ist es, die Momente der Veränderung einer Reihe von Sammlungen komplexer Objekte zu verfolgen. Ich kann ein Objekt und eine Sammlung in eine Zeichenkette umwandeln, es werden etwa 2000 Zeichen pro Sammlung sein. Können Sie mir sagen, welche Bibliotheksfunktion am besten geeignet ist, um eine kurze Darstellung eines so langen Strings zu erhalten?
CryptEncode/Decode und wählen Sie HASH_xxx Methoden.
Sie können sogar ZIP :-) ein normaler Text von 2000 gedruckten Zeichen ist eine schäbige 200-300 Bytes, es kann in 4 long`es passen.
FehlerCryptDecode(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); }
---
Die Funktion CryptEncodeA erzeugt eine Zeichenkette, die dannCryptDecodeA nicht entschlüsseln kann und einen Fehler in mt4: "4029", in mt5: "4006" ausgibt. Das Terminal hat verschlüsselt, was es selbst nicht entschlüsseln kann.
Zeile aus dem Protokoll: vj9jDk+GxxB4W1zQc4/rC4OPvttMcgcF5ZFVC7m7l50=
Wenn Sie das letzte "="- entfernen, wird es entschlüsselt und es tritt kein Fehler auf.
Gleichzeitig entschlüsselt php normal und korrekt:
$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;
---
Verschlüsseln Sie die gleiche Zeichenfolge auf dem Server: "indicator_chart_window".
Erhalten Sie das Ergebnis:"vj9jDk+GxxB4W1zQc4/rC54fEtkLAsAONkyeprqmMlw=""
Wir fügen diese Zeile in den mql-Code ein und erhalten wieder eine Fehlermeldung - entfernen Sie das letzte "=" und alles funktioniert einwandfrei.
---
Ich habe einen zufälligen Verschlüsselungsschlüssel eingegeben, auf dem Server lautet die Zeichenfolge: "8CpXr3OlVhGs41syHA0+HqZKnatswQjRWn2fKYN4qN4=="
Ich fügte die Zeichenkette in mql-code ein - Fehler,entfernte ein "=" und ließ nur eins übrig - funktionierte gut (was der Schlüssel war, der eine Zeichenkette mit zwei Gleichheitszeichen erzeugte - konnte ich nicht reproduzieren).
Ich möchte eine Antwort bekommen, vielleicht mache ich etwas falsch!
P.S. Ich habe alle Codes beigefügt, was könnte das Problem sein?Die Funktion StringToArray fängt die Terminierung Null ein, wenn Sie die Länge der Zeichenkette nicht angeben (historisch)
Daher sollten Sie in der Funktion CryptDecodeA
StringToCharArray(InputText,scr,0,StringLen(InputText));
anstelle von
StringToCharArray(InputText,scr);
- www.mql5.com
Die Funktion StringToArray erfasst die Terminierung Null, wenn Sie die Länge der Zeichenkette nicht angeben (historisch)
Daher ist es in der CryptDecodeA-Funktion notwendig, die
anstelle von
Ich habe es in verschiedenen Varianten geprüft - alles funktioniert.
Ein Problembleibt:
StringReplace(res,"\x00..\x1F",""); // Не помогает
Wie entfernt man nicht druckbare Zeichen?
Danke!
In verschiedenen Varianten geprüft - alles funktioniert.
Ein Problembleibt:
Wie entfernt man nicht druckbare Zeichen?
Ich danke Ihnen!
Es gibt keine Funktion in MQL mit der Funktionalität, die Sie benötigen
Es ist einfacher, dies zu tun, bevor man das Array in einen String umwandelt:
//+------------------------------------------------------------------+ //|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); //--- keine Daten zu konvertieren if(start>=input_size || count==0) return(NULL); //--- Startparameter festlegen if(start<0) start=0; //--- Zählparameter festlegen if(count<0 || count==WHOLE_ARRAY || (start+count)>input_size) count=input_size-start; //--- Eingabe-Array unverändert umwandeln if(!remove_non_printable) return(cvt::convert(input_array,start,count,codepage)); //--- nicht druckbare Symbole aus dem Eingabefeld entfernen 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++]; //--- Prüfung auf negative Werte, input_array kann vorzeichenbehaftet sein if(input_sym>0 && input_sym<' ') continue; //--- Null ist Abschlusszeichen if(input_sym==0) break; //--- Eingangssymbol kopieren cvt_array[cvt_size++]=input_sym; } //--- gereinigtes Array in String umwandeln return(cvt::convert(cvt_array,0,cvt_size)); } //+------------------------------------------------------------------+ //| Skript-Programmstartfunktion| //+------------------------------------------------------------------+ 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)); } //+------------------------------------------------------------------+
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Bibliothek von Hash-Funktionen und Umwandlungen in andere Zahlensysteme:
Autor: Aleksandr Chugunov