Se si desidera che la classe di bitset che meglio supporta la conversione in binario e il proprio set di bit superi le dimensioni di unsigned long, la migliore opzione da utilizzare è boost::dynamic_bitset. (Presumo che sia più di 32 e anche 64 bit se sei preoccupato di risparmiare spazio).
Da dynamic_bitset è possibile utilizzare to_block_range per scrivere i bit nel tipo integrale sottostante. Puoi ricostruire il dynamic_bitset dai blocchi usando from_block_range o il suo costruttore da BlockInputIterator o effettuando le chiamate append().
Ora i byte sono nel loro formato nativo (Blocco), si ha ancora il problema di scriverlo in un flusso e di leggerlo di nuovo.
È necessario memorizzare prima un po 'di informazioni di "intestazione": il numero di blocchi che si hanno e potenzialmente l'endianness.Oppure potresti usare una macro per convertire in un endianness standard (es. Ntohl ma useresti idealmente una macro che è no-op per la tua piattaforma più comune quindi se questo è little-endian probabilmente vorrai memorizzare in quel modo e convertire solo per sistemi big-endian).
(Nota: suppongo che boost :: dynamic_bitset converta in modo standard i tipi di integrale nello stesso modo indipendentemente dall'endianità sottostante, la loro documentazione non dice).
Per scrivere numeri binari su un flusso utilizzare os.write(&data[0], sizeof(Block) * nBlocks)
e leggere l'uso è. read(&data[0], sizeof(Block) * nBlocks)
dove si presume che i dati siano vector<Block>
e prima di leggere è necessario eseguire data.resize(nBlocks)
(non reserve()
). (Puoi anche fare cose strane con istream_iterator
o istreambuf_iterator
ma ridimensionare() è probabilmente meglio).
In realtà non mi importava che memorizzasse ogni bit come un byte nella mia domanda ... era solo formulato ambiguamente. Buona domanda di follow-up –