Это альтернативное предложение для ответа, который я оставил выше. Я предлагаю вам рассмотреть возможность его реализации, потому что он будет действовать почти так же, как и решение на C, где вы можете выбирать поля из пакета по имени.
Вы можете начать с внешнего текстового файла, например, такого:
OneByte, 1
OneBit, .1
TenBits, .10
AlsoTenBits, 1.2
SignedInt, +4
Может указывать всю структуру пакета, включая поля, которые могут повторяться. Язык может быть настолько простым или сложным, насколько вам нужно -
Вы бы создали такой объект:
new PacketReader packetReader("PacketStructure.txt", byte[] packet);
Ваш конструктор будет перебирать файл PacketStructure.txt и сохранять каждую строку в качестве ключа хеш-таблицы, а точное местоположение ее данных (как смещение в битах, так и размер) в качестве данных.
Как только вы создали объект, передавая bitStructure и пакет, вы можете получить произвольный доступ к данным с помощью таких простых операторов, как:
int x=packetReader.getInt("AlsoTenBits");
Также обратите внимание, что этот материал будет гораздо менее эффективен, чем структура C, но не так сильно, как вы думаете - он все еще, вероятно, во много раз эффективнее, чем вам нужно. Если все сделано правильно, файл спецификации будет проанализирован только один раз, так что вы получите только незначительное попадание при поиске одного хеша и несколько двоичных операций для каждого значения, считанного из пакета, - совсем неплохо.
Исключение составляют случаи, когда вы анализируете пакеты из высокоскоростного непрерывного потока, и даже в этом случае я сомневаюсь, что быстрая сеть может затопить даже медленный процессор.