Есть ли упоминания о наличии указанного c bitstream
объекта в будущем выпуске C ++, помимо C ++ 20 или в стандартной библиотеке? Например; у нас может быть объект std::bitset<n>
, где n
- это постоянное известное интегральное значение.
Псевдо-пример:
#include <bitstream>
template<unsigned N>
class Foo {
public:
std::bitset<N> bits_;
};
Здесь у нас есть шаблон класса, который будет указывать, сколько битов в объекте std::bitset
. Что хорошо.
У нас также есть stream
объекты, такие как iostream
, fstream
, sstream
и др. c. где мы можем передавать значения различных типов данных в эти потоки, либо читая, либо записывая их в поток строк, поток файлов, поток ввода-вывода на консоль или терминал и т. д. c ...
Что я хотел бы знать, есть ли предложение иметь объект потока, подобный приведенному выше, но указать c для произвольной последовательности битов, аналогичной природе std::bitset
, где вы можете передать набор битов в поток. Например, это может выглядеть примерно так:
#include <bitset>
#include <bitstream> // not an actual library - only suggestive
int main() {
std::bitset<8> byte{0xFE};
std::bitset<16> word{0xFEDC};
std::bitset<32> dword{0xFEDCBA98};
std::bitset<64> qword{0xFEDCBA9876543210};
std::bitstream bs;
bs << byte << word << dword << qword;
std::cout << bs;
return 0;
}
Здесь ожидаемый результат будет выглядеть следующим образом:
11111110111111101101110011111110110111001011101010011000111111101101110010111010100110000111011001010100001100100001000
В зависимости от порядкового номера предполагаемого использования ...
Поворот также будет применим. Если бы у нас уже был заполненный объект bitstream
, такой как в примере выше, мы могли бы извлечь определенные c битовые последовательности из bitstream
следующим образом:
#include <bitset>
#include <bitstream> // not an actual library - only suggestive
#include <iomanip> // manipulators for bitstreams not yet implemented...
int main() {
std::bitset<8> byte{0xFE};
std::bitset<16> word{0xFEDC};
std::bitset<32> dword{0xFEDCBA98};
std::bitset<64> qword{0xFEDCBA9876543210};
std::bitstream bs;
bs << byte << word << dword << qword;
std::bitset<3> odd3;
std::bitset<5> odd5;
std::bitset<7> odd7;
bs >> bs::msb >> odd3 >> odd7 >> odd5;
std::cout << odd3 << '\n' << odd7 << '\n' << odd5;
bs >> bs::lsb >> odd5 << odd3 << odd7;
std::cout << odd5 << '\n' << odd3 << '\n' << odd7;
// Or by using a constructor with a value for the bit size...
std::bitset<9> odd9( bs ); // odd9(bs::msb), odd9(bs::lsb)...
return 0;
}
И ожидаемые результаты вытянули бы биты из направлений MSB или LSB на величину размера bitset
объекта соответственно.
Точно так же, как iostream
и другие библиотеки потоков, используя библиотеку <iomanip>
, которую мы может иметь модификаторы форматирования, которые будут разбивать этот ввод или вывод на дискретные bit-segments
любой заданной длины, например каждые 4 или 8 бит, или отображать его как шестнадцатеричное, et c ... Все операции с битами и вычисления все равно будут быть ответственным std::bitset
.
Возможность извлекать sh или извлекать произвольные bitset
объекты в и из bitstream
объекта, который будет совместим со всеми другими stream
подобными объектами, может быть очень мощным и полезным инструмент или функция.
Есть ли упоминание о чем-то подобном или уже существует что-то похожее на эту природу без необходимости конвертировать туда и обратно между строками или другими типами, и т.д. c.?
EDIT -User- walnut
привел несколько замечательных примеров в своем ответе относительно этого и того, что это уже можно сделать с использованием существующих iostream
объектов и операторов , Вы можете прочитать его ответ и комментарии в обсуждении, однако я просто хотел проиллюстрировать свои соображения относительно библиотеки объектов stream
, которая написана и предназначена для явной и конкретной работы с bitset
типами данных.
Представьте себе такую функцию:
// Not written with perfect syntax or compilation in mind,
// only psuedo to illustrate a point.
template<typename... T>
std::ostream& concatinateBitSequences( T&& ... t ) { // assuming all t are bitset<n>
std::stringstream sstream;
sstream << t...;
return sstream;
}
и сравните ее тоже ...
// Not written with perfect syntax or compilation in mind,
// only psuedo to illustrate a point.
template<typename... T>
std::bitstream& concatinateBitSequences( T&& ... t ) { // assuming all t are bitset<n>
std::bitstream bs;
bs << t...;
return bs;
}
Вызывающий пользователь знает, что он возвращает bitstream
явно или специально по сравнению с произвольным stream
объектом! Это было моим основным намерением или целью ... Это больше ориентировано на удобочитаемость и более выразительно в коде, показывающем правильные намерения. Кроме того, он будет тесно связан с объектами bitset
, что означает, что объект bitstream
будет принимать только данные, поступающие из bitset
s или других bitstream
объектов, но он может передавать свои данные в bitset
s, bitstream
с или другие stream
объекты.