Как мне преобразовать набор битов в массив байтов / uint8? - PullRequest
6 голосов
/ 28 ноября 2011

Мне нужно извлечь байты из набора битов, которые могут (не) содержать несколько битов CHAR_BIT. Я теперь, сколько битов в наборе битов мне нужно поместить в массив. Например,

набор битов объявлен как std::bitset < 40> id;

Существует отдельная переменная nBits, сколько битов в id можно использовать. Теперь я хочу извлечь эти биты кратными CHAR_BIT. Мне также нужно позаботиться о случаях, когда nBits % CHAR_BIT != 0. Я в порядке, чтобы поместить это в массив uint8

Ответы [ 2 ]

16 голосов
/ 31 января 2012

Вы можете использовать boost :: dynamic_bitset , который можно преобразовать в диапазон «блоков» с помощью boost :: to_block_range .

#include <cstdlib>
#include <cstdint>
#include <iterator>
#include <vector>
#include <boost/dynamic_bitset.hpp>

int main()
{
    typedef uint8_t Block; // Make the block size one byte
    typedef boost::dynamic_bitset<Block> Bitset;

    Bitset bitset(40); // 40 bits

    // Assign random bits
    for (int i=0; i<40; ++i)
    {
        bitset[i] = std::rand() % 2;
    }

    // Copy bytes to buffer
    std::vector<Block> bytes;
    boost::to_block_range(bitset, std::back_inserter(bytes));
}
3 голосов
/ 28 ноября 2011

К сожалению, в языке нет хорошего способа, если вам нужно больше количества бит в unsigned long (в этом случае вы можете использовать to_ulong).Вам придется перебирать все биты и самостоятельно генерировать массив байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...