Всем, кажется, нравится использовать битовые поля в struct
s для этого. Лично я оборачиваю весь свой пакетный код в объекты, чтобы вы не видели смелости. Проблема, которую я обнаружил при использовании битовых полей для кода протокола, заключается в том, что он поощряет использование структур в качестве наложений на память. Вы можете сделать это безопасно, но вы должны быть крайне осторожны, чтобы убедиться, что вы правильно справляетесь с проблемами порядка и упаковки. Если у вас нет веской причины (например, вы пишете код, который получает пакет Ethernet из области ввода-вывода с отображением в памяти), то использование битовых полей, наложенных на память, приводит к крайне хрупкому коду IMHO.
Мне гораздо проще написать класс Packet
, который реализует процедуры извлечения, вставки и перезаписи с разной шириной в битах. Затем вы реализуете свой код обработки пакетов с точки зрения извлечения значений определенной ширины из смещений в собственные целые числа, а что нет. Скрывайте все абстракции и проблемы упаковки за абстракцией до тех пор, пока профилирование не покажет, что накладные расходы слишком велики, чтобы их нести.
Это один из тех уроков, которые я хотел бы выучить несколько лет назад ... вы можете подумать, что переносимость кода не является проблемой и не является бесконечностью. Поверьте мне, количество головных болей, которые это вызывает у вас, когда ваш компилятор меняет свой алгоритм заполнения или вы переключаетесь на другой компилятор, убедит вас, что оверлеи - это очень плохая идея для кода обработки сетевых пакетов.