从基础到中级:数组和字符串(三)·综合运用
📘

从基础到中级:数组和字符串(三)·综合运用

第 3/3 篇

◍ 用字符串扰动生成固定长度密码串

下面这段脚本演示了如何把一段葡萄牙语句子转成 8 位长度的字符密码,逻辑不依赖任何外部库,直接跑在 MT5 脚本里即可。 核心函数是 PassWord(),它接收待处理字符串 szArg 和目标长度 SizePsw。内部先定义了一张 48 字符的映射表 szCodePhrase,再用 ArrayResize 把输出数组 psw 扩到指定长度并清零。 循环里对原句每个字符取模映射表长度,得到下标 pos,把对应字符累加进 psw[i],i 到长度上限就回绕到 0。传入 'Um pequeno jabuti xereta viu dez cegonhas felizes' 与长度 8,终端会打印出一段 8 字符结果,外汇与贵金属杠杆交易高风险,这类字符串算法仅作工具验证,不代表任何收益可能。

MQL5 / C++
class="macro">#class="kw">property copyright "Daniel Jose"
class="type">void OnStart(class="type">void)
{
   const class="type">class="kw">string sz_Secret_Phrase = "Um pequeno jabuti xereta viu dez cegonhas felizes";
   Print("Result:\n", PassWord(sz_Secret_Phrase, class="num">8));
}
class="type">class="kw">string PassWord(const class="type">class="kw">string szArg, const class="type">uchar SizePsw)
{
   const class="type">class="kw">string szCodePhrase = ")0The!1quick@2brownclass="macro">#3fox$4jumps%5over^6the&7lazy*8dog(class="num">9";
   class="type">uchar   psw[],
           pos,
           i = class="num">0;
   ArrayResize(psw, SizePsw);
   ArrayInitialize(psw, class="num">0);
   for(class="type">int c = class="num">0; szArg[c]; c++)
   {
      pos = (class="type">uchar)(szArg[c] % StringLen(szCodePhrase));
      psw[i++] += (class="type">uchar)szCodePhrase[pos];
      i = (i == SizePsw ? class="num">0 : i);
   }
   class="kw">return CharArrayToString(psw);
}

密码数组的循环回绕与字符映射

这段逻辑处理口令索引越界与字符替换。第25行当 i 等于 SizePsw 时归零,形成环形游标,避免数组越界访问。 第28到29行遍历 psw 数组,每个元素对助记串长度取模后,从 szCodePhrase 取出对应字符重新写回 psw。也就是说原索引值只当作偏移量,最终口令由助记串里的可见字符构成。 第31行用 CharArrayToString 把 uchar 数组拼成字符串返回。验证时把 SizePsw 设成 8、szCodePhrase 设为 "ABCDEFGH",原 psw 全 0 会直接得到 "AAAAAAAA",可据此确认取模映射没有偏移错误。外汇与贵金属 EA 加载此类口令生成器需注意密钥泄露风险,参数文件勿明文随策略包分发。

MQL5 / C++
i = (i == SizePsw ? class="num">0 : i);
  }
  
  for (class="type">uchar c = class="num">0; c < SizePsw; c++)
    psw[c] = (class="type">uchar)(szCodePhrase[psw[c] % StringLen(szCodePhrase)]);

  class="kw">return CharArrayToString(psw);
}

「最后一句大实话」

这一节里我们只是刚碰到二进制值和字符串数组化的边,也看清了数组使用中最容易踩的那个坑——把越界当常态。收尾处那次“愉快的事故”其实是数组长度误判导致的写溢出,下一篇才会展开怎么在编译期就堵住它。 如果你现在打开 MT5 新建个脚本,故意往大小为 3 的数组写第 4 个元素,终端会直接抛 数组越界 错误并终止执行;这个现象本身比任何提醒都直观,值得你亲手跑一遍确认。 外汇与贵金属杠杆交易高风险,代码层面的数组错误可能让 EA 在实盘瞬间崩掉,验证请先用策略测试器。

常见问题

把基准字符集放进数组,按扰动索引循环取字符并拼接,长度用计数器卡死即可,避免越界。
多半是取模运算没对字符集长度取余,或映射表下标从1开始而非0,统一用0基下标加取模。
可以,把代码贴给小布,它会指出循环回绕边界和字符映射偏移问题,并给修正示例。
一般是循环终止条件写成了小于等于长度而非小于,或扰动索引提前越界退出,核对计数器边界。
短映射用字符串按位置取字符最直观,复杂映射再用数组,两者都要配合取模防越界。