求助关于MQL4 decode编解码问题

 

大家好,

我在MQL4的脚本里通过encode函数生成了一个加密字符串,uchar的长度是24位,通过print打印出来复制,然后在另外EA的input参数里输入进去,得到的字符串通过StringToCharArray(InpLicenseCode,dst)转换成uchar数组却是49位的,然后decode就会报错,我猜想应该是编解码的问题。

有人是否做过类似的事情,希望能提供代码供我参考,不胜感激!

下面我将分别放上脚本的代码和EA init的部分代码:

void OnStart() 
  { 
   string text="5436362,AAA,2025.11.20"; 
   string keystr="BlackDream"; 
   uchar src[],dst[],key[]; 
//--- prepare key 
   StringToCharArray(keystr,key); 
//--- copy text to source array src[] 
   StringToCharArray(text,src); 
//--- print initial data 
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src)); 
//--- encrypt src[] with DES 56-bit key in key[] 
   int res=CryptEncode(CRYPT_BASE64,src,key,dst); 
//--- check error 
   if(res>0) 
     { 
      //--- print encrypted data 
      PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst)); 
      //--- decode dst[] to src[] 
      res=CryptDecode(CRYPT_BASE64,dst,key,src); 
      //--- check error      
      if(res>0) 
        { 
         //--- print decoded data 
         PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src)); 
        } 
      else 
         Print("Error in CryptDecode. Error code=",GetLastError()); 
     } 
   else 
      Print("Error in CryptEncode. Error code=",GetLastError()); 
  }
int OnInit() {
//--- create timer
   OrderObj = new OrderInfo(Symbol(),0,InpMagic);
   TradeObj = new TradeClass(Symbol(),OrderObj,InpMagic,3,MaxSpread,COMMENT);
   StringSplit(InpLotDIY,StringGetCharacter(",",0),LotDIY);
   StringToCharArray(keystr,key); 
   StringToCharArray(InpLicenseCode,dst); 
   //HexToBytes(InpLicenseCode,dst); 
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(dst),CharArrayToString(dst)); 
   PrintFormat("Initial data: size=%d, string='%s'",ArraySize(key),CharArrayToString(key)); 
   int res = CryptDecode(CRYPT_BASE64,dst,key,src);
   if(res>0){
   }else{
      printf("res=="+res);
      Print("Error in CryptDecode. Error code=",GetLastError()); 
   }
   
   
   printf("src==="+CharArrayToString(src));
   StringSplit(CharArrayToString(src),StringGetCharacter(",",0),LicenseDate);
   printf("ArraySize(LicenseDate)=="+ArraySize(LicenseDate));
   printf("License[2]=="+LicenseDate[2]);
   if(InpIncreaseType == INCREASE_DIY) {
      MaxOrder = ArraySize(LotDIY);
   } else {
      MaxOrder = InpMaxOrder;
   }
   return(INIT_SUCCEEDED);
}
 
jianbin huang:

大家好,

我在MQL4的脚本里通过encode函数生成了一个加密字符串,uchar的长度是24位,通过print打印出来复制,然后在另外EA的input参数里输入进去,得到的字符串通过StringToCharArray(InpLicenseCode,dst)转换成uchar数组却是49位的,然后decode就会报错,我猜想应该是编解码的问题。

有人是否做过类似的事情,希望能提供代码供我参考,不胜感激!

下面我将分别放上脚本的代码和EA init的部分代码:

已经解决,引用官方文档里的描述:

此处及下文,请注意在 StringToCharArray 之后使用 ArrayResize。务必将数组大小减少 1 个元素,因为如果 StringToCharArray 函数将字符串转换为字节数组时包含了末尾的 0,这可能会破坏程序的预期执行。特别是在这种情况下,我们的秘密密钥中会有一个额外的零字节,如果在接收端没有使用带有类似人为处理的程序,那么它将无法解密消息。这种额外的零也可能影响与数据交换协议的兼容性(如果 MQL 程序与“外部世界”进行某种集成)。

ArrayResize(key, ArraySize(key) - 1);