Во многих ситуациях (особенно в низкоуровневом программировании) важна двоичная структура данных. Например: манипулирование оборудованием/драйвером, сетевыми протоколами и т. д.
В C++ я могу читать/записывать произвольные двоичные структуры, используя char*
и побитовые операции (маски и сдвиги), но это утомительно и подвержено ошибкам. Очевидно, я пытаюсь ограничить объем этих операций и инкапсулировать их в API более высокого уровня, но это все еще проблема.
Кажется, что битовые поля C++ предлагают удобное для разработчиков решение этой проблемы, но, к сожалению, их хранилище зависит от реализации.
Натан Оливер упомянул std::bitset
, который в основном позволяет вам получить доступ к отдельным битам целого числа с помощью красивого operator[]
, но не имеет средств доступа для многобитных полей.
Используя метапрограммирование и/или макросы, можно абстрагировать побитовые операции в библиотеке. Поскольку я не хочу изобретать велосипед, я ищу библиотеку (желательно STL или boost), которая это делает.
Для протокола: я ищу здесь DNS, но проблема и ее решение должны быть общими.
Изменить: короткий ответ: оказывается, хранение битовых полей на практике надежно (даже если это не предусмотрено стандартом), поскольку системные/сетевые библиотеки используют их и дают программы с хорошим поведением при компиляции с помощью основных компиляторов.
std::bitset
- person NathanOliver   schedule 30.07.2015So this left me wondering if there was a nice C++ language-feature or library (preferably STL or boost) for reading/writing bitfields ?
как просьбуrecommend or find a book, tool, software library, tutorial or other off-site resource
- person NathanOliver   schedule 30.07.2015BitField<unsigned long, 3, 12>
, представляющего собой битовое поле, выделенное в битах 3...14unsigned long
(где конструктор должен предоставить адрес беззнакового длинного) и поддерживающее назначение из целых чисел и неявное преобразование в целое число. - person 6502   schedule 30.07.2015