Экономия места при записи набора битов в файл в C ++ - PullRequest
0 голосов
/ 02 марта 2011

Мне было интересно, как я могу сэкономить место, записывая набор битов в файл (возможно, используя iostream) в c ++. Сэкономит ли мне место разбиение набора битов на набор размером 8, а затем запись каждого отдельного набора в файл? Что вы думаете об этом? Это намерение сжатия данных.

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Если вместо этого вы используете boost::dynamic_bitset, вы можете указать тип базовых блоков и получить их с помощью функций to_block_range и from_block_range.

http://www.boost.org/doc/libs/1_46_0/libs/dynamic_bitset/dynamic_bitset.html#to_block_range

(например, используйте unsigned char в качестве типа блока и сохраняйте их в потоке в двоичном режиме)

0 голосов
/ 02 марта 2011

Если вы обычно записываете один байт на бит в наборе битов, тогда да, сохранение восьми элементов в байте сэкономит вам 7/8 пространства в пределе (вам придется где-то хранить размер набора битов, Конечно).

Например, здесь записывается bitset с использованием одного символа на бит (7/8 служебных данных):

for (size_t i=0, n=bs.size(); i<n; ++i)
    stream << bs[i];

, в то время как это сохраняет его оптимально компактным (если не учитывать заполнение в конце):

for (size_t i=0, n=(bs.size() + 1) % 8; i<n; ++i) {
    uint8_t byte=0;
    for (size_t j=0; j<8; ++j)
        byte = (byte << 1) | bs[i*8 + j];
    stream << byte;
}

Обратите внимание, что uint8_t не является стандартным C ++ 03. Он находится в C99 <stdint.h> или C ++ 0x <cstdint>. Вы также можете использовать std::bitset<8>, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...