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. 更新块的外观。

这些块返回一个一定长度的数组。 为了更容易处理单个位或字符,块的输出值的采样步骤被做成等于字符串的长度。 在1c模型的积分步骤中,常量块只会每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, titlefont=font(10)
)
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

结论

将术语表示为数字数组在协议分析和加密任务中很有用。

使用这些块可以隐藏相关专家对字符串的不必要的技术工作级别,并专注于演示模拟过程或算法。

示例中使用的块