|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
Выборка из List<byte>12.03.2019, 15:14. Показов 3821. Ответов 40
Метки нет (Все метки)
Добрый день. Имеется список формата - List<byte>. Требуется сделать выборку из лиса.
Найти 2 байта 0xA1, 0xA2 и взять все, что находится после и до 0xB1, 0xB2. Пробовал Linq но фигня получалась.
0
|
|
| 12.03.2019, 15:14 | |
|
Ответы с готовыми решениями:
40
Конвертировать из byte[] в List<string> и обратно Конвертировать из byte[] в List<object> и обратно Выборка из List |
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 08:46 [ТС] | |
|
Wolfdp, спасибо за ответ. Но Ваш пример выдает исключение.
Дополнительные сведения: Коллекция была изменена; невозможно выполнить операцию перечисления. Ругается на это foreach (var b in source) Добавлено через 39 секунд Скорее всего, это связано с таем, что коллекция постоянно пополняется. я об этом забыл сказать... Добавлено через 7 минут Элд Хасп, замена помогла ошибок нет. Но есть несколько проблем. Моя вина в том, что я не сказал про то, что коллекция это List<byte> который всегда пополняется. Будет ли работать пример если искать нужно от 0xA1,0xA2, ....до...., 0xA1,0xA2? В любом случае спасибо. В Вашем примере была таже ошибка что и у примера выше (в момент, когда пытаюсь вернуть результат return byteByteA1A2B1B2.ToArray() ![]() Дополнительные сведения: Коллекция была изменена; невозможно выполнить операцию перечисления. Добавлено через 12 минут Лист пополняется по 1 байту с интервалом 1-2 мс
0
|
|
|
Модератор
|
|||
| 13.03.2019, 11:31 | |||
|
У Вас реализована многопоточность? Если да, то методы LINQ не подойду, насколько знаю.
1
|
|||
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 11:33 [ТС] | |
|
Элд Хасп, да, многопоточность. Из порта прут данные по 1 байту. (ReadByte)
0
|
|
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 11:38 [ТС] | |
|
Wolfdp, да. Я решил уйти от события datareceived ибо оно не успевает нормально работать с такой задержкой.И стал читать по одному байту. Теперь из этого всего пытаюсь собирать сообщение.
0
|
|
|
Модератор
|
||||||
| 13.03.2019, 11:48 | ||||||
|
Так как методы данного вычисления очень быстрые, то при многопоточности можно сделать так:
1
|
||||||
|
|
||
| 13.03.2019, 12:00 | ||
![]() Зачем? Вы в курсе что даже отправив 1 байт в порт, он не сразу улетает, а вполне себе может закешироватся, дождатся следующего байта и только тогда улететь? MTU вообще предпологает пакеты в 1500 (вроде). Делайте нормальный Recive, если у вас TCP, то вообще можно смело использовать TcpClient и переходить на Stream делаете Read, анализируете полученый блок, если не весь -- дочитываете.
1
|
||
|
Модератор
|
||
| 13.03.2019, 12:01 | ||
|
Есть индикаторы начала и конца сообщений в этом потоке. Если да, то Вы неверно подошли к решению. Метод получающий байт, должен проверять индикатор начала сообщения. Если это начало сообщения, то подымается флаг накопления сообщения и создаётся буфер для накопления сообщения. Остальные байту идут в буфер сообщения и проверяются на индикатор конца сообщения. Как был отловлен конец сообщения, накопленное в буфере сообщение записывается в список (или очередь) готовых сообщений, и сбрасывается флаг накопления сообщения.
1
|
||
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 12:22 [ТС] | |
|
Wolfdp, отправляющее устройство не мое.
Элд Хасп, да, данные по COM идут от внешнего устройства. Блин. Вот казалось бы элементарно. Дождаться стартовой последовательности. Ну мне это вообще в голову не приходило... P.S. связь с устройством по RS-485
0
|
|
|
Модератор
|
||
| 13.03.2019, 12:30 | ||
|
Забыл написать. Когда сообщение готово, то лучше не напрямую его записывать в список. Так другие части программы не смогут этого узнать. Лучше генерировать событие в котором пересылать это сообщение. Кому надо - тот подпишется на это событие и будет обрабатывать новое сообщение.
1
|
||
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 12:43 [ТС] | |
|
Элд Хасп, я понял. Спасибо. Про событие. Пример можно? Ни раз так не делал.
0
|
|
|
Модератор
|
||||||||||||||||||||||
| 13.03.2019, 13:01 | ||||||||||||||||||||||
|
В пространстве имён объявляете делегат
Если нет, то сами создаёте метод.
При полном накоплении сообщения, вызываете метод OnMessageBytes с передачей в параметрах накопленных байт сообщения. Это сообщение попадает в метод receiver_MessageBytes, который их обрабатывает.
1
|
||||||||||||||||||||||
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 13:02 [ТС] | |
|
Элд Хасп, ааа. Я понял. datareceived так же был реализован. Спасибо. Очень помогли. Сейчас буду делать.
0
|
|
|
Модератор
|
||
| 13.03.2019, 13:48 | ||
|
Возможно это связанно с длительностью обработки полученного сообщения. Поэтому получение байтов надо реализовывать в своём отдельном индивидуальном потоке. Чтобы это получение работало в реал-тайм. При передаче собранного сообщения создавайте новый поток (явно или в асинхронном методе) и вызывайте событие в этом новом потоке.
1
|
||
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 14:59 [ТС] | |
|
Элд Хасп, да. Понял. Единственное, я не могу верную логику построить из-за того что старт посылки обозначается 2мя байтами... А заканчивается 2мя байтами CRC как оказалось далее.
Добавлено через 15 минут Элд Хасп, точнее саму логику придумал. Но не могу реализовать именно "прямо" и надежно. 1. Т.к. старт посылки обозначается 2мя байтами, ждем первый из них, если приходит - записываем его. 2. Ловим следующий байт. Если это именно наш - второй стартовый, то проверяем есть ли в записи на нулевой позиции первый стартовый, если есть пишем на первую позицию второй стартовый и поднимаем флаг чтения. 3. В процессе чтения получаем байт в котором указывается длина информационной части пакета. 4. Узнаем общую длину пакета (инф. часть плюс служебная информация). 5. Пишем пакет до тех пор, пока он не будет равен рассчитанной длине. 6. Если дошли до такой длины берем CRC из пакета и сравниваем с рассчитанным CRC. 7. Если все норм то отправляем на обработку. Добавлено через 2 минуты Можно как нибудь алгоритм укоротить или более прямым сделать?
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
|
|
| 13.03.2019, 15:39 | |
|
Для подобных задач (где данные могут прийти не сразу, а частями, либо несколько пакетов склеенных в один) как раз и придумали System.IO.Pipelines
System.IO.Pipelines: High performance IO in .NET
1
|
|
|
191 / 29 / 8
Регистрация: 15.09.2011
Сообщений: 430
|
|
| 13.03.2019, 15:58 [ТС] | |
|
Ну вроде все сделал. Норм пашет. Нужно погонять это все.
Добавлено через 39 секунд Someone007, ни раз не встречал. Сейчас гляну. Спасибо
0
|
|
|
Модератор
|
||
| 13.03.2019, 16:28 | ||
|
Операции все быстрые, выполняются мгновенно. Но обратите внимание на совет Someone007. Задача получения данных по COM порту очень распространённая. Наверняка есть множество готовых решений. Возможно одно из них Вам подойдёт лучше чем Ваша собственная реализация.
0
|
||
| 13.03.2019, 16:28 | |
|
Выборка элемента по названию в List
Ошибка. не получается устранить(list = List<byte>) Поиск в списке массивов (List<byte[]>) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|