Kütüphaneler: Hash fonksiyonları kütüphanesi ve diğer sayı sistemlerine dönüşümler

 

Hash fonksiyonları kütüphanesi ve diğer sayı sistemlerine dönüşümler:

Kütüphane genel amaçlı hash fonksiyonlarının algoritmalarını içerir: adler32, CRC-32, MaHash8v64. Base sisteminde ondalıktan dize gösterimine dönüştürme işlevlerinin yanı sıra bunun tersi de geçerlidir.

Author: Aleksandr Chugunov

 

İyi günler!

Görev, bir dizi karmaşık nesne koleksiyonunun değişim anlarını izlemektir. Bir nesneyi ve bir koleksiyonu bir dizeye dönüştürebilirim, koleksiyon başına yaklaşık 2000 karakter olacak. Bu kadar uzun bir dizginin kısa bir gösterimini elde etmek için hangi kütüphane işlevinin daha doğru olacağını söyleyebilir misiniz?

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

İyi günler!

Görev, bir dizi karmaşık nesne koleksiyonunun değişim anlarını izlemektir. Bir nesneyi ve bir koleksiyonu bir dizeye dönüştürebilirim, koleksiyon başına yaklaşık 2000 karakter olacak. Bu kadar uzun bir dizenin kısa gösterimini almak için hangi kütüphane işlevinin daha doğru olacağını söyleyebilir misiniz?

CryptEncode/Decode ve HASH_xxx yöntemlerini seçin.

ZIP bile yapabilirsiniz :-) 2000 basılı karakterden oluşan normal bir metin 200-300 bayttır, 4 long`a sığabilir.

 

HataCryptDecode(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 işlevi bir dize oluşturur , daha sonraCryptDecodeA bu dizenin şifresini çözemez ve mt4'te "4029", mt5'te "4006" hatası verir. Terminal kendi şifresini çözemeyeceği bir şifreleme yapmıştır.

Günlükten satır: vj9jDk+GxxB4W1zQc4/rC4OPvttMcgcF5ZFVC7m7l50=

Son "="- işaretini kaldırırsanız şifre çözülür ve hata oluşmaz.

Aynı zamanda php normal ve doğru bir şekilde kod çözer:

$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;

---

Sunucuda aynı dizeyi şifreleyin: "indicator_chart_window".

Sonucu alın:"vj9jDk+GxxB4W1zQc4/rC54fEtkLAsAONkyeprqmMlw=""

Bu satırı mql koduna ekliyoruz ve yine bir hata alıyoruz - son "=" yi kaldırıyoruz ve her şey yolunda gidiyor.

---

Rastgele bir şifreleme anahtarı koydum, sunucuda dize şu: "8CpXr3OlVhGs41syHA0+HqZKnatswQjRWn2fKYN4qN4=="

Dizeyi mql koduna ekledim - hata,sadece bir tane bırakarak bir "=" kaldırdım - iyi çalıştı (iki eşit olan bir dize oluşturan anahtar neydi - yeniden üretemedim)

Bir cevap almak istiyorum, belki yanlış bir şey yapıyorumdur!

Not: Tüm kodları ekledim, sorun ne olabilir?
 

StringToArray işlevi, dizenin uzunluğunu belirtmezseniz (tarihsel olarak) sonlandırmayı sıfır olarak yakalar

Bu nedenle, CryptDecodeA işlevinde şunları kullanmalısınız

StringToCharArray(InputText,scr,0,StringLen(InputText));

yerine

StringToCharArray(InputText,scr);
Документация по MQL5: Общие функции / CryptDecode
Документация по MQL5: Общие функции / CryptDecode
  • www.mql5.com
CryptDecode - Общие функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ilyas:

StringToArray işlevi, dizenin uzunluğunu belirtmezseniz (tarihsel olarak) sonlandırmayı sıfır olarak yakalar

Bu nedenle, CryptDecodeA işlevinde aşağıdakileri kullanmak gerekir

yerine

İlyas

Farklı varyasyonlarda kontrol ettim - her şey çalışıyor.

Tek bir sorunkaldı:

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

Yazdırılmayan karakterler nasıl kaldırılır?

Teşekkürler!

 
Vitaly Muzichenko:

İlyas

Farklı varyasyonları kontrol ettim - her şey çalışıyor.

Bir sorunkaldı:

Yazdırılmayan karakterler nasıl kaldırılır?

Teşekkür ederim!

MQL'de ihtiyacınız olan işlevselliğe sahip bir fonksiyon yoktur

Diziyi bir dizeye dönüştürmeden önce bunu yapmak daha kolaydır:

//+------------------------------------------------------------------+
//|ArrayToString.mq5 |
//| Telif Hakkı 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);
//--- dönüştürülecek veri yok
   if(start>=input_size || count==0)
      return(NULL);
//--- başlangıç parametresini düzelt
   if(start<0)
      start=0;
//--- sayım parametresini düzelt
   if(count<0 || count==WHOLE_ARRAY || (start+count)>input_size)
      count=input_size-start;
//--- girdi dizisini olduğu gibi dönüştürün
   if(!remove_non_printable)
      return(cvt::convert(input_array,start,count,codepage));
//--- yazdırılamayan sembolleri girdi dizisinden kaldırın
   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++];
      //--- negatif olup olmadığını kontrol edin, input_array işaretli olabilir
      if(input_sym>0 && input_sym<' ')
         continue;
      //--- sıfır sonlandırıcıdır
      if(input_sym==0)
         break;
      //--- giriş sembolünü kopyala
      cvt_array[cvt_size++]=input_sym;
     }
//--- temizlenmiş diziyi dizeye dönüştür
   return(cvt::convert(cvt_array,0,cvt_size));
  }
//+------------------------------------------------------------------+
//| Komut dosyası programı başlatma işlevi|
//+------------------------------------------------------------------+
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));
  }
//+------------------------------------------------------------------+