从基础到中级:数组和字符串(三)·综合运用
◍ 用字符串扰动生成固定长度密码串
下面这段脚本演示了如何把一段葡萄牙语句子转成 8 位长度的字符密码,逻辑不依赖任何外部库,直接跑在 MT5 脚本里即可。 核心函数是 PassWord(),它接收待处理字符串 szArg 和目标长度 SizePsw。内部先定义了一张 48 字符的映射表 szCodePhrase,再用 ArrayResize 把输出数组 psw 扩到指定长度并清零。 循环里对原句每个字符取模映射表长度,得到下标 pos,把对应字符累加进 psw[i],i 到长度上限就回绕到 0。传入 'Um pequeno jabuti xereta viu dez cegonhas felizes' 与长度 8,终端会打印出一段 8 字符结果,外汇与贵金属杠杆交易高风险,这类字符串算法仅作工具验证,不代表任何收益可能。
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 加载此类口令生成器需注意密钥泄露风险,参数文件勿明文随策略包分发。
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 在实盘瞬间崩掉,验证请先用策略测试器。