Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с произвольным количеством бит  (Прочитано 6418 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Конская сбруя
Интересующийся

ru
Offline Offline

« : 14-04-2011 07:28 » 

Столкнулся с задачей, где требуется работать с данными произвольного размера.
Решаю задачу реализации алгоритма сжатия входных данных методом lzw. Алгоритм предполагает создание таблицы последовательно идущих символов кодом постоянно увеличивающейся длины. Т.е. если кодируются символы размером в 1 байт = 8 бит, то таблица, по мере заполнения, начинает заполняться кодами размером 9 бит, потом 10 бит и т.д.
В связи с этим и возник вопрос: как писать, а потом доставать из файла в памяти данные с произвольным количеством бит, не кратным байту?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-04-2011 09:21 » 

Если это алгоритм Хафмана, то нужна не таблица, а двоичное дерево. Набор узлов от листа до корня и есть нужные биты.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Конская сбруя
Интересующийся

ru
Offline Offline

« Ответ #2 : 14-04-2011 09:37 » 

Вопрос в том, как записать в файл / извлечь из файла нужное количество бит не кратное байту
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 14-04-2011 09:45 » 

Писать не в файл, а в буфер. В файл пишутся байты.
Запоминай последний байт и позицию следующего бита.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PredatorAlpha
Помогающий

ua
Offline Offline

« Ответ #4 : 14-04-2011 14:00 » 

Читаешь 64 бита, делаешь сдвиг и маску. В чём проблема?
Записан
Конская сбруя
Интересующийся

ru
Offline Offline

« Ответ #5 : 14-04-2011 17:23 » 

Понял, спасибо за подсказки.

Добавлено через 4 дня, 22 часа, 57 минут и 26 секунд:
В процессе проверки алгоритмов возникла удивительная ситуация:
- алгоритм компрессии помещает преобразовывает входные данные в код постоянно возрастающей длины,
- преобразованный код помещается в выходной, а putc (buffer(тип long), output_file); выводит их побайтно,
- формируется файл с сжатым кодом,
- распаковщик действует обратным способом: читает из сжатого файла побайтно данные функцией getc(input_file);
- принятые данные помещает во входной буфер, формирует код и распаковывает байты.

Так вот всё прекрасно работает, но иногда возникает проблема в распаковщике: где-то в середине файла он вдруг ни с того, ни с сего принимает EOF, т.е. конец файла, хотя до конца еще далеко. Понять в чём проблема не могу. Компрессия работает нормально, проверял. А распаковщик чудит.
Похоже, что символ EOF читается в файле между символами B7 и 1A (HEX)
« Последнее редактирование: 19-04-2011 16:21 от Конская сбруя » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 19-04-2011 16:26 » 

Конская сбруя, файл открывается на чтение как бинарный?
Записан
Конская сбруя
Интересующийся

ru
Offline Offline

« Ответ #7 : 19-04-2011 17:15 » 

Файл открывается следующим образом:
output_file = fopen("C:\file.lzw","w");

Спасибо за подсказку. Изменил режим на бинарный, всё решилось
« Последнее редактирование: 19-04-2011 17:55 от Конская сбруя » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines