Si desea la clase de bitset que mejor admite la conversión a binario, y su conjunto de bits es más que el tamaño de unsigned long, entonces la mejor opción es boost::dynamic_bitset. (Supongo que son más de 32 e incluso 64 bits si le preocupa ahorrar espacio).
Desde dynamic_bitset puede usar to_block_range para escribir los bits en el tipo integral subyacente. Puede construir el dynamic_bitset desde los bloques utilizando from_block_range o su constructor desde BlockInputIterator o realizando llamadas a append().
Ahora que tiene los bytes en su formato nativo (Bloque), todavía tiene el problema de escribirlo en una secuencia y leerlo de nuevo.
Primero tendrá que almacenar un poco de información de "encabezado": la cantidad de bloques que tiene y posiblemente la endianidad.O puede usar una macro para convertir a una endianidad estándar (por ejemplo, ntohl pero idealmente usará una macro que no es operativa para su plataforma más común, por lo que si es poco endiablada probablemente quiera almacenar de esa manera y convertir solo para sistemas big-endian).
(Nota: asumo que boost :: dynamic_bitset convierte de forma estándar los tipos integrales de la misma manera, independientemente de la endiancia subyacente. Su documentación no lo dice).
Para escribir números binarios en una secuencia use os.write(&data[0], sizeof(Block) * nBlocks)
y para leer el uso. read(&data[0], sizeof(Block) * nBlocks)
donde se supone que los datos son vector<Block>
y antes de leer debe hacer data.resize(nBlocks)
(no reserve()
). (También puede hacer cosas raras con istream_iterator
o istreambuf_iterator
pero resize() es probablemente mejor).
En realidad, no me importaba que guardara cada bit como un byte en mi pregunta ... estaba redactado de forma ambigua. Buena pregunta de seguimiento. –