Я работаю над проектом, который содержит переменные разных размеров бит из двоичного файла. Например, одна строка файла (в шестнадцатеричном формате) может выглядеть как «FF C0 AA 00 FE». Из этой строки, например, нужна следующая информация: 4 бита, 7 бит, 11 бит, 8 бит и т. Д. Проблема, с которой я столкнулась, - это некоторые из выделенных чисел будут подписаны, а другие будут беззнаковыми (4 и 7 бит могут быть подписаны, 11 и 8 бит без знака).Как обрабатывать нерегулярные размеры бит
Я изначально извлекал, маскируя и меняя значения Hex, чтобы получить C++ char/short/int из 4, 7, 11, 8 бит. Однако, если я посмотрю на бит в двоичном формате, он будет отображаться как 00001011. Это число должно быть отрицательным, основанным на ведущем 1 (должно быть только 4 бита 1011), но C++ признает его положительным, так как он смотрит на все 8 бит.
Еще один пример для пояснения, я мог бы извлечь 11 бит из файла, который должен быть (11100101101), но в C++ короткий формат, который он отображается как (0000011100101101), должен быть подписан на основе ведущего 1 в 11 бит.
Мне было интересно, каким будет идеальный способ справиться с этим. Я рассматривал возможность создания класса бит/байта, единственная проблема заключается в изменении размеров бит (4,7,11,8).
Спасибо, мы надеемся, что это имеет смысл. Я довольно новичок в двоичном коде на C++, поэтому может быть встроенная функция, которую я не видел.
«FF C0 AA 00 FE» - это последовательность из 4-х, 7-битных, 11-битных, 8-битных, ... данных? – Ben
Как насчет использования структуры [bitfield] (http://en.cppreference.com/w/cpp/language/bit_field)? Или ['std :: bitset'] (http://en.cppreference.com/w/cpp/utility/bitset) также полезен для вашего дела. –
Если FF C0 AA 00 FE из файла, в двоичном формате он отображается как (11111111 1100000 10101010 ...), тогда мне нужно взять первые 4 бита как одно число, поэтому 1111. Затем следующее число равно 7 бит, и это будет 1111110 (4 бита из FF, 4 из C0), 11 бит будут 00000101010 и т. д. – user2840470