Bibliotheken: Bibliothek von Hash-Funktionen und Umwandlungen in andere Zahlensysteme

 

Bibliothek von Hash-Funktionen und Umwandlungen in andere Zahlensysteme:

Die Bibliothek enthält Algorithmen universeller Hash-Funktionen: adler32, CRC-32 und MaHash8v64 sowie Funktionen zur Umwandlung aus dem Dezimalsystem in ein Base-Zahlensystem und umgekehrt.

Autor: Aleksandr Chugunov

 

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?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Тип string предназначен для хранения текстовых строк. Текстовая строка представляет собой последовательность символов в формате Unicode с завершающим нулем на конце. string-переменной может быть назначена строковая константа. Строковая константа представляет собой последовательность символов Unicode, заключенную в двойные кавычки: "Это...
 
Nikolai Karetnikov:

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);
Документация по MQL5: Общие функции / CryptDecode
Документация по MQL5: Общие функции / CryptDecode
  • www.mql5.com
CryptDecode - Общие функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilyas:

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

@Ilyas

Ich habe es in verschiedenen Varianten geprüft - alles funktioniert.

Ein Problembleibt:

StringReplace(res,"\x00..\x1F",""); // Не помогает

Wie entfernt man nicht druckbare Zeichen?

Danke!

 
Vitaly Muzichenko:

@Ilyas

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));
  }
//+------------------------------------------------------------------+