使用 Engee 块处理字符串
在本例中,我们将创建一些 "自定义块",以便对数组字符串执行操作。
任务描述
在处理字符串时,有时需要使用大量的数学工具,而这些工具在教材和文章中通常是通过流程图来展示的(例如,在密码学中)。在这类问题中,能够快速建立解决方案模型、探索替代方案并进行实验是非常有用的。以块的形式表示算法可以提高可读性,简化处理算法结构的工作,便于将算法与信息处理的其他阶段结合起来,实现界面可视化等。
我们为本示例创建的自定义块旨在展示 Engee 中使用图形建模工具处理字符串的方法之一。

在每个区块的属性中,都有一个可以输入字符串的字段。

对该字符串的进一步处理在掩码编辑器中进行,该编辑器通过所需的方法将其转换为数字矢量:
- 将其转换为位表示、
- 或按每个字母在拉丁字母表中的位置进行编码(小写--
AbC
变为123
)、 - 或在西里尔字母表中做同样的处理 (
бвГ
变成234
)。

掩码会进行预处理,并将 "文本 "字段中输入的字符串转换为所需的编码。也可以直接在掩码中组织编码选择。
块掩码的作用
每个自定义区块的掩码:
- 将文本转换为所需的编码,并将其设置为
Value
数据块Constant
的参数,隐藏在掩码之下、 - 为块
Constant
设置一个特殊的采样时间 (SampleTime
),以便在通过块Unbuffer
后,每秒输出一个字符的输出参数向量、 - 更新数据块的外观。
块返回一个一定长度的数组。为便于处理单个比特或符号,块输出值的采样步长等于字符串的长度。*如果模型的积分步长为 1 秒,常数块每 5 秒才会输出一个 5 个字符的字符串。在每个常量模块之后都有一个 Unbuffer 模块,用于将输入向量分解为单个元素,并为每个模拟步长返回一个元素。
运行模型
使用软件控制指令启动模型:
# Загрузим модель, если она еще не открыта на холсте
if "string_to_bytes_model" ∉ getfield.(engee.get_all_models(), :name)
engee.load( "$(@__DIR__)/string_to_bytes_model.engee");
end
model_data = engee.run( "string_to_bytes_model" );
让我们绘制第一个程序块的输出结果Unicode String To Bytes
:
data_frames = collect( model_data["Unicode String To Bytes.1"] );
data_stream = collect( model_data["Unbuffer.1"] );
plot(
plot( data_frames.time, hcat( data_frames.value... )' .+ (0.01.*collect(1:8))', st=:step, markershape=:circle, title="Кадры (8 бит в каждом + смещение для визуализации)" ),
plot( data_stream.time, data_stream.value, st=:step, markershape=:circle, title="Поток битов" ),
layout=(2,1), legend=false
)
我们得到二进制表示的字符串 "A"(拉丁字符A
,十进制编码0x41
或65
):0100 0001
。
要获得 "字节表示 "的字符串,可以使用
codeunits(ваша_строка)
命令,但应注意源字符串是以Unicode编码的,因此西里尔字符将是双字节。
codeunits( "Привет" )'
结论
将术语表示为数字数组在协议分析和密码学中非常有用。
使用这些数据块,就可以将不必要的字符串技术工作隐藏起来,而不被资料专家发现,并集中精力演示建模过程或算法。