Engee 文档
Notebook

使用 Engee 块处理字符串

在本例中,我们将创建一些 "自定义块",以便对数组字符串执行操作。

任务描述

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

我们为本示例创建的自定义块旨在展示 Engee 中使用图形建模工具处理字符串的方法之一。

post_pic_string_to_vector_blocks.png

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

image.png

对该字符串的进一步处理在掩码编辑器中进行,该编辑器通过所需的方法将其转换为数字矢量:

  • 将其转换为位表示、
  • 或按每个字母在拉丁字母表中的位置进行编码(小写--AbC 变为123 )、
  • 或在西里尔字母表中做同样的处理 (бвГ 变成234)。

image.png

掩码会进行预处理,并将 "文本 "字段中输入的字符串转换为所需的编码。也可以直接在掩码中组织编码选择。

块掩码的作用

每个自定义区块的掩码:

  1. 将文本转换为所需的编码,并将其设置为Value 数据块Constant 的参数,隐藏在掩码之下、
  2. 为块Constant 设置一个特殊的采样时间 (SampleTime),以便在通过块Unbuffer 后,每秒输出一个字符的输出参数向量、
  3. 更新数据块的外观。

块返回一个一定长度的数组。为便于处理单个比特或符号,块输出值的采样步长等于字符串的长度。*如果模型的积分步长为 1 秒,常数块每 5 秒才会输出一个 5 个字符的字符串。在每个常量模块之后都有一个 Unbuffer 模块,用于将输入向量分解为单个元素,并为每个模拟步长返回一个元素。

运行模型

使用软件控制指令启动模型:

In [ ]:
# Загрузим модель, если она еще не открыта на холсте
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

In [ ]:
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
)
Out[0]:

我们得到二进制表示的字符串 "A"(拉丁字符A ,十进制编码0x4165 ):0100 0001

要获得 "字节表示 "的字符串,可以使用codeunits(ваша_строка) 命令,但应注意源字符串是以Unicode编码的,因此西里尔字符将是双字节

In [ ]:
codeunits( "Привет" )'
Out[0]:
1×12 adjoint(::Base.CodeUnits{UInt8, String}) with eltype UInt8:
 0xd0  0x9f  0xd1  0x80  0xd0  0xb8  0xd0  0xb2  0xd0  0xb5  0xd1  0x82

结论

将术语表示为数字数组在协议分析和密码学中非常有用。

使用这些数据块,就可以将不必要的字符串技术工作隐藏起来,而不被资料专家发现,并集中精力演示建模过程或算法。

示例中使用的块