İ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?
- www.mql5.com
İ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);
- www.mql5.com
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
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!
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)); } //+------------------------------------------------------------------+
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
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