Как boost:: dynamic_bitset хранит биты

Мне трудно понять, что делают внутри boost:::dynamic_bitset или std::vector. Что я в конечном итоге хочу сделать, так это составить сетевой фрейм и отправить его через сокет, но я просто не могу преобразовать их таким образом, чтобы сохранить порядок битов, который я собрал...

#include <iostream>
#include<stdio.h>
#include "boost/dynamic_bitset.hpp"


int main()
{
    boost::dynamic_bitset<> b(8, 10);          // 8 Bits, value 10

    std::cout << "b     = " << b << std::endl; // as expected

    printf("Vector size: %i\n", b.size());
    printf("Bits: %d", b);                     // ?
    return 0;
}

Я понимаю, что класс перегрузил оператор потока ‹‹, поэтому у меня правильный вывод, в то время как printf, кажется, показывает необработанную структуру. Мне кажется даже не детерминированным (ниже неоднократно выполнялся один и тот же .exe без перекомпиляции):

команд

Мои вопросы:

  1. Что происходит в основном под капотом? Судя по всему, это вообще не сравнимо с массивом.
  2. Как я могу отправить такой набор битов через сокет send()?

person Marcel Boldt    schedule 06.09.2016    source источник
comment
Передача объекта, который не является типом int, в спецификатор printf %d является неопределенным поведением.   -  person aschepler    schedule 06.09.2016


Ответы (1)


boost::dynamic_bitset<> внутренне хранит биты в целых числах без знака, которые хранятся в std::vector<>. Однако внутреннее хранилище не открыто, поэтому вы не можете получить к нему прямой доступ.

Вы можете использовать to_block_range, чтобы скопировать массив целых чисел. И конструктор для преобразования этого массива целых чисел вернуться к boost::dynamic_bitset<>.

person Maxim Egorushkin    schedule 06.09.2016
comment
Прошло довольно много времени, но спасибо за ответ. Однако я хотел избежать операции копирования, поэтому я пересмотрел весь свой подход и вернулся к битовым операциям в стиле C над массивом символов. - person Marcel Boldt; 21.12.2017