Вверх ↑
Ответов: 4622
Рейтинг: 746
#1: 2017-06-08 14:01:07 ЛС | профиль | цитата
Просто для мысленного эксперимента приведу пример. Есть событие onRead. Оно выдаёт данные (строки) порциями неопредленной длины. Предположим, данные имеют вид:
"<тип данных><длина><разделитель><данные указанной длины>"

Поле <тип данных> всегда 1 байт - равно "0" - строка, равно "1" - файл.
Поле <длина> - число переменной длины, например, "1", "123", "2147483647", поэтому для определения его длины используется <разделитель> (1 байт). Затем идут данные указанной длины и назначения.
Поскольку данные выдаются порциями разной длины, требуется некоторый накопитель (но это другая задача).
Предположим, нам выдались следующие данные:
onRead 1: "0123|данные"
onRead 2: " длиной"
onRead 3: " 123 байта......."

Решается задача с помощью переключателя так:
1) Переключатель в положении 0 (ветка 0) - накапливаем данные до получения разделителя. При получении разделителя: считываем первый символ - получаем "тип данных", считываем символы со 2-го до разделителя - получаем "длину данных", пропускаем один байт разделителя, сохраняем "остаток" после разделителя. По типу данных 0 - переключаем переключатель на ветку 1. По типу данных 1 - переключаем на ветку 2.
2) Переключатель в положении 1 - данные типа "строка". Берем "остаток", полученный в ветке 0 (если есть). Сохраняем. Уменьшаем "длину данных" на длину "остатка". При получении очередного события onRead переключатель направляет полученные данные снова в эту ветку. Если полученные данные больше/равны оставшейся "длине данных":
- скопируем из них первые "длина данных" байт, добавим к уже полученной части строки, сохраним "остаток" в накопителе (ветка 0 должна учесть отданный здесь остаток).
- вся строка нужной "длины" получена. Обрабатываем, как нам нужно.
- переключаем переключатель на ветку 0 - опять ожидаем разделителя
Если полученные данные меньше оставшейся "длины данных":
- присоединяем все текущие данные к ранее полученным
- уменьшаем "длину данных" на полученное количество
- следующее событие опять направит данные в эту ветку переключателем, пока сохраненная "длина данных" не достигнет 0.
3) Ветка 2 - полученный "остаток" и последующие данные являются файлом - открыть файл, сохранять в него все поступающие данные до получения указанной длины, по завершению закрыть файл, переключиться в ветку 0 (ожидание и обработка разделителя), аналогично п.2.
карма: 26

0
Редактировалось 3 раз(а), последний 2017-06-08 14:05:30