Я пытался реализовать некоторые протокольные декодеры, но каждый раз, когда я сталкиваюсь с «простой» проблемой, я чувствую, что способ решения проблемы не оптимален, и должен быть лучший способ сделать что-то , Я использую C. В настоящее время я использую некоторые консервированные данные и считываю их как файл, но позже это будет сделано через TCP или UDP.
Вот проблема. Я сейчас играю с двоичным протоколом на работе. Все поля имеют длину 8 бит. Первое поле (8 бит) - это тип пакета. Поэтому я читаю первые 8 бит и, используя переключатель / регистр, вызываю функцию для чтения в остальной части пакета, так как затем я знаю его размер / структуру. НО ... у некоторых из этих пакетов есть вложенные пакеты внутри них, поэтому, когда я сталкиваюсь с этим конкретным пакетом, мне нужно прочитать еще 8-16 байтов, у которых есть другой переключатель / регистр, чтобы увидеть, что следующий тип пакета и так далее включен. (К счастью, пакеты имеют только 2 или 3 вложенности).
Только после того, как весь пакет будет декодирован, я могу передать его на конечный автомат для обработки.
Полагаю, это может быть и более общий вопрос. Сколько данных вы должны прочитать за раз из сокета? Как можно больше? Столько, сколько «похоже» в заголовках протокола?
Так что, хотя этот протокол довольно прост, мой код представляет собой целую кучу операторов switch / case, и я много читаю из файла / сокета, что я считаю не оптимальным. Моя главная цель - сделать этот декодер максимально быстрым. Для более опытных людей это путь или есть лучший путь, который я еще не выяснил? Любое изящное решение этой проблемы?