Иногда мне приходится писать раного рода парсеры для двоичный форматов. Почти всегда это работа по сети с разными устройствами по разным протоколам. Для примера возьмем netSDR — протокол работы с цифровыми приемниками.
https://www.moetronix.com/files/NetSdrInterfaceSpec105.pdf
Парсеры должны быть довольно быстрыми и просто написанными (для того чтобы ошибки были маловероятны, легко находимы и устранимы).
Но я не могу выработать для себя идельный набор best practices.
Мой последний список такой
Максимально использовать терминологию протокола, хорошо помогает начать использовать библиотеку тем пользователям которые все-таки читают документацию)
Использовать System.IO.Pipelines для управления буферами памяти
Использовать события C# для генерации
Использовать Span<T> и структуры чтобы не выделять память в куче
Пока не ясные моменты:
Кажется уместным по соображениям удобстра комбинирования событий использовать IObservable<T>, но метод OnNext(T) не допускает передачи параметров по ссылке (ref или in), что меня расстраивает)
Для некоторых сообщений общий формат такой
8 bit Length lsb , 3 bit type 5 bit Length msb, потом N байт тела сообщения.
Приходится делать событие OnDataMessageReceived(TypeAsEnum messageType, int len, Span<byte> dataBytes), а потом реинтерпритировать dataBytes в зависимости от типа. Хочется иметь событие OnDataMessageReceived(in
ТутКакойТоТипСПолями1Тип2Длина3Данные data). Но структуру неизвестного во время компиляции размера не объявишь, не особо страшно но хочется идеала)
Какие правилами, практиками вы пользуетесь?
Какие практики и правила кажутся вам уместными?