Работа со строками при помощи блоков Engee¶
В этом примере мы создадим несколько "пользовательских блоков", которые позволят нам выполнять операции над строками в виде массивов.
Иногда работа со строками требуется применения существенного математического аппарата, который в учебных материалах и статьях принято представлять через блок-схемы (например, в крипторгафии). В таких задачах весьма полезно иметь возможность быстро моделировать решение, исследовать альтернативы и производить эксперименты. Представление алгоритма в виде блоков улучшает читаемость и упрощает работу с их структурой, позволяет легко объединять алгоритм с другими этапами обработки информации, визуализировать интерфейсы и т.д.
Пользовательские блоки, созданные нами для этого примера, призваны продемонстрировать один из подходов для работы со строками средствами графического моделирования в Engee.
В свойствах каждого блока есть поле, через которое можно ввести строку.
Дальнейшая работа с этой строкой осуществляется в редакторе масок, который преобразует ее в численный вектор по требуемому методу:
- переводит в битовое представление,
- либо кодирует каждую букву через ее положение в латинском алфавите (в нижнем регистре -
AbC
станет 123
),
- либо делает то же самое в кириллическом алфавите (
бвГ
станет 234
).
Маска осуществляет предобработку и преобразует строку, введенную в поле "Текст", в нужную кодировку. Возможно также организовать выбор кодировки прямо в маске.
Маска каждого пользовательского блока:
- переводит текст в нужную кодировку и проставляет ее в качестве параметра
Value
блока Constant
, скрытого под маской,
- проставляет блоку
Constant
особое время дискретизации (SampleTime
), чтобы после прохождения через блок Unbuffer
вектор выходных параметров выдавался по одному символу в секунду,
- обновляет внешний вид блока.
Блоки возвращают массив некоторой длины. Чтобы облегчить работу с отдельными битами или символами, шаг дискретизации выходного значения блока делается равным длине строки. При шаге интегрирования модели 1с, строка длиной 5 символов будет выдаваться блоком Constant лишь каждые 5 секунд. После каждого такого блока находится блок Unbuffer, который раскладывает входной вектор на отдельные элементы и возвращает по элементу за каждый шаг симуляции.
Запуск этой модели при помощи команд программного управления:
Построим график вывода первого блока Unicode String To Bytes
:
Мы получаем строку "A" (латинский символ A
, код 0x41
или 65
в десятеричной системе) в бинарной репрезентации: 0100 0001
.
Получить строку в "побайтовом представлении" можно при помощи команды codeunits(ваша_строка)
, но стоит иметь в виду, что исходная строка закодирована в Unicode, из-за чего кириллические символы будут двухбайтовыми.
Out[0]:
1×12 adjoint(::Base.CodeUnits{UInt8, String}) with eltype UInt8:
0xd0 0x9f 0xd1 0x80 0xd0 0xb8 0xd0 0xb2 0xd0 0xb5 0xd1 0x82
Представление срок в виде массива чисел пригодится в задачах анализа протоколов и криптографии.
Использование подобных блоков позволяет скрыть от профильного специалиста ненужные уровни технической работы со строками и сосредоточиться на демонстрации моделируемого процесса или алгоритма.
Блоки, использованные в примере¶
{"id": "db94afce-9c7b-49b7-b8b6-83ab310436d5", "data": [{"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(108, 159, 51, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.01, 0.01, 0.01], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y1", "yaxis": "y", "legendgroup": "y1", "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.01, 0.01, 0.01, 0.01, 0.01], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(0, 154, 250, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [1.02, 1.02, 1.02], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y2", "yaxis": "y", "legendgroup": "y2", "line": {"color": "rgba(227, 111, 71, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [1.02, 1.02, 1.02, 1.02, 1.02], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(227, 111, 71, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.03, 0.03, 0.03], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y3", "yaxis": "y", "legendgroup": "y3", "line": {"color": "rgba(62, 164, 78, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.03, 0.03, 0.03, 0.03, 0.03], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(62, 164, 78, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.04, 0.04, 0.04], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y4", "yaxis": "y", "legendgroup": "y4", "line": {"color": "rgba(195, 113, 210, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.04, 0.04, 0.04, 0.04, 0.04], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(195, 113, 210, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.05, 0.05, 0.05], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y5", "yaxis": "y", "legendgroup": "y5", "line": {"color": "rgba(172, 142, 24, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.05, 0.05, 0.05, 0.05, 0.05], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(172, 142, 24, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.06, 0.06, 0.06], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y6", "yaxis": "y", "legendgroup": "y6", "line": {"color": "rgba(0, 170, 174, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.06, 0.06, 0.06, 0.06, 0.06], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(0, 170, 174, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0.07, 0.07, 0.07], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y7", "yaxis": "y", "legendgroup": "y7", "line": {"color": "rgba(237, 94, 147, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0.07, 0.07, 0.07, 0.07, 0.07], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "", "yaxis": "y", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(237, 94, 147, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [1.08, 1.08, 1.08], "type": "scatter", "x": [0, 8, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 3, "currentCount": 3}}}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.7395833333333333, "title": {"text": ""}, "len": 0.40392607174103246, "x": 0.9934383202099738}, "name": "y8", "yaxis": "y", "legendgroup": "y8", "line": {"color": "rgba(198, 130, 37, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [1.08, 1.08, 1.08, 1.08, 1.08], "type": "scatter", "x": [0, 8, 8, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 5, "currentCount": 5}}}, {"showlegend": false, "mode": "markers", "xaxis": "x2", "colorbar": {"y": 0.23958333333333323, "title": {"text": ""}, "len": 0.4039260717410324, "x": 0.9934383202099738}, "name": "", "yaxis": "y2", "legendgroup": "", "marker": {"symbol": "circle", "color": "rgba(108, 159, 51, 1.000)", "line": {"color": "rgba(0, 0, 0, 1)", "width": 1}, "size": 8}, "y": [0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0], "type": "scatter", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 17, "currentCount": 17}}}, {"showlegend": true, "mode": "lines", "xaxis": "x2", "colorbar": {"y": 0.23958333333333323, "title": {"text": ""}, "len": 0.4039260717410324, "x": 0.9934383202099738}, "name": "y1", "yaxis": "y2", "legendgroup": "y1", "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 1}, "y": [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], "type": "scatter", "x": [0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16], "zaxis": null, "z": null, "metadata": {"shouldEnableSmartZoom": false, "smartZoomParams": {"minCount": 25000, "maxCount": 33, "currentCount": 33}}}], "config": {"showlegend": false, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "height": 400, "yaxis2": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 0.25, 0.5, 0.75, 1], "range": [-0.030000000000000027, 1.03], "domain": [0.03762029746281702, 0.44154636920384943], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0.00", "0.25", "0.50", "0.75", "1.00"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "xaxis2": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 5, 10, 15], "range": [-0.4800000000000004, 16.48], "domain": [0.0658209390492855, 0.9934383202099738], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0", "5", "10", "15"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y2", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "annotations": [{"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 20}, "yref": "paper", "showarrow": false, "text": "Кадры (8 бит в каждом + смещение для визуализации)", "xref": "paper", "x": 0.5296296296296296}, {"yanchor": "top", "xanchor": "center", "rotation": 0, "y": 0.49999999999999994, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 20}, "yref": "paper", "showarrow": false, "text": "Поток битов", "xref": "paper", "x": 0.5296296296296296}], "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "width": 1320.375, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 5, 10, 15], "range": [-0.4800000000000004, 16.48], "domain": [0.0658209390492855, 0.9934383202099738], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0", "5", "10", "15"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "yaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 0.25, 0.5, 0.75, 1], "range": [-0.02210000000000001, 1.1121], "domain": [0.537620297462817, 0.9415463692038495], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0.00", "0.25", "0.50", "0.75", "1.00"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}}}