Если вам нужен класс набора битов, который лучше всего поддерживает преобразование в двоичный файл, и ваш набор битов больше размера беззнакового long, то лучшим вариантом для использования будет boost :: dynamic_bitset . (Я полагаю, это больше 32 и даже 64 бит, если вы заинтересованы в экономии места).
Из dynamic_bitset вы можете использовать to_block_range для записи битов в базовый целочисленный тип. Вы можете создать dynamic_bitset обратно из блоков, используя from_block_range или его конструктор из BlockInputIterator или выполнив вызовы append ().
Теперь у вас есть байты в их собственном формате (блок), у вас все еще есть проблема записи его в поток и чтения его обратно.
Сначала вам нужно будет сохранить немного информации «заголовка»: количество блоков и, возможно, порядковый номер. Или вы можете использовать макрос для преобразования в стандартный порядок байтов (например, ntohl, но в идеале вы будете использовать макрос, который не предназначен для вашей наиболее распространенной платформы, так что, если он является прямым порядком байтов, вы, вероятно, захотите сохранить его и конвертировать только системы с прямым порядком байтов).
(Примечание. Я предполагаю, что boost :: dynamic_bitset стандартно преобразует целочисленные типы одинаково, независимо от порядка следования байтов. В документации их не сказано).
Для записи двоичных чисел в поток используйте os.write( &data[0], sizeof(Block) * nBlocks )
, а для чтения используйте. read( &data[0], sizeof(Block) * nBlocks )
, где предполагается, что данные равны vector<Block>
, и перед чтением вы должны сделать data.resize(nBlocks)
(не reserve()
). (Вы также можете делать странные вещи с istream_iterator
или istreambuf_iterator
, но resize (), вероятно, лучше).