Как написать битовый поток

Я думаю о записи некоторых данных в битовый поток с помощью C. Есть два способа прийти на ум. Один из них заключается в объединении символов переменной битовой длины в непрерывную битовую последовательность, но таким образом моему декодеру, вероятно, будет трудно отделить эти символы от этого непрерывного битового потока. Другой способ состоит в том, чтобы распределить одинаковое количество битов для каждого символа, и таким образом декодер может легко восстановить исходные данные, но это может привести к потере битов, поскольку символы имеют разные значения, что, в свою очередь, приводит к тому, что многие биты в битовом потоке теряются. ноль (я думаю, это пустые биты).

Любой намек, что я должен делать?

Я новичок в программировании. Любая помощь будет оценена.


person user1530192    schedule 16.07.2012    source источник
comment
Вот мой ответ на аналогичный вопрос здесь: stackoverflow.com/questions/11253123/   -  person Viktor Latypov    schedule 17.07.2012
comment
Обычный способ — упаковать биты, но для этого требуется логика, чтобы знать количество битов на другой стороне. Вы можете в конечном итоге расшифровать бит за битом, чтобы узнать, когда вы достигли конца символа.   -  person Mark Ransom    schedule 17.07.2012
comment
Ваш вопрос относится к области кодирования. Кодирование Хаффмана, как упоминалось ниже, является одним из вариантов. Но есть и другие, так как кодирование Хаффмана не единственное (но, безусловно, самое популярное). См. книгу «Алгоритмы сжатия и кодирования» Моффата и Терпина. В большинстве книг по сжатию есть что-то о кодировании; эта книга посвящена кодированию. Что касается трудного разделения времени, вам нужен код без префиксов — ни один код не является префиксом другого.   -  person Ray    schedule 07.08.2012


Ответы (1)


Похоже, вы пытаетесь сделать что-то похожее на схему сжатия Хаффмана? Я бы просто пошел по байтам (char) и отслеживал смещение в байте, где я читал последний символ.

Предполагая, что ни один из ваших символов не будет больше char. Это будет выглядеть примерно так:

struct bitstream {
   char *data;
   int data_size;           // size of 'data' array
   int last_bit_offset;     // last bit in the stream 

   int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte
   int current_bit_offset;  // which bit we are currently reading/writing
}

char decodeNextSymbol(bitstream *bs) {

}

int encodeNextSymbol(bitstream *bs, char symbol) {

}

Соответствующий код для decodeNextSymbol и encodeNextSymbol должен был бы использовать побитовые операции C (например, '&' (побитовое И) и '|' (побитовое ИЛИ). Затем я составил бы список всех своих символов, начиная с сначала самый короткий, и выполните цикл while, который соответствует самому короткому символу. Например, если один из ваших символов «101», тогда, если поток «1011101», он будет соответствовать первому «101» и будет продолжать соответствовать остальная часть потока «1101». Вам также придется обрабатывать случай, когда ваши значения символов переполняются от одного байта к другому.

person Patrick Raphael    schedule 17.07.2012