Wenn Sie möchten, dass die Bitset-Klasse, die die Konvertierung in Binärwerte am besten unterstützt, und Ihr Bitset mehr als die Länge von unsigned lang hat, ist die beste zu verwendende Option boost::dynamic_bitset. (Ich nehme an, es ist mehr als 32 und sogar 64 Bits, wenn Sie sich Sorgen um Platz sparen).
Von dynamic_bitset können Sie to_block_range verwenden, um die Bits in den zugrunde liegenden Integraltyp zu schreiben. Sie können das dynamic_bitset aus den Blöcken mithilfe von from_block_range oder seinem Konstruktor aus BlockInputIterator oder durch Aufruf von append() aufbauen.
Jetzt haben Sie die Bytes in ihrem nativen Format (Block) Sie haben immer noch das Problem, es in einen Stream zu schreiben und es wieder zu lesen.
Sie müssen zuerst ein bisschen "Header" Informationen speichern: die Anzahl der Blöcke, die Sie haben, und möglicherweise die Endianess.Oder Sie verwenden ein Makro, um in eine Standard-Endiane zu konvertieren (zB ntohl, aber Sie werden idealerweise ein Makro verwenden, das für Ihre gängigste Plattform nicht funktioniert. Wenn Sie also Little Endian verwenden, möchten Sie das wahrscheinlich speichern und nur für konvertieren big-endian Systeme).
(Hinweis: Ich gehe davon aus, dass boost :: dynamic_bitset standardmäßig integrale Typen auf die gleiche Weise konvertiert, unabhängig von der zugrunde liegenden Endianz. Ihre Dokumentation sagt nicht).
Um Zahlen binär in einen Strom zu schreiben, verwenden Sie und zu lesen verwenden. read(&data[0], sizeof(Block) * nBlocks)
wo angenommen wird, dass Daten vector<Block>
sind und vor dem Lesen müssen Sie data.resize(nBlocks)
(nicht reserve()
) tun. (Sie können auch komische Sachen mit istream_iterator
oder istreambuf_iterator
machen, aber resize() ist wahrscheinlich besser).
Eigentlich war mir egal, dass es jedes Bit als ein Byte in meiner Frage gespeichert ... es war nur zweideutig formuliert. Gute Folgefrage. –