![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Регистрация: 04.01.2011
Сообщений: 4
|
![]()
Всем привет, вот уже два дня колупаюсь с байтами файлов. Пытаюсь писать байты, что бы файл как можно меньше весил (Хаффман). Но как не пытаюсь в любой HEX редакторе вижу непонятные наборы байтов. Если пишу данные как текстовый файл, то вес слишком большой, а байты записать так и не получилось.
Код:
![]() |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 17.09.2010
Сообщений: 229
|
![]()
А Что ты хочешь видеть там где у тебя выделено красным? 0 и 1.. так и пиши туда 0 или 1 )
Правильно заданный вопрос - половина ответа!
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
0 и 1 это биты скорее а не байты.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
непонятные не значит неправильные )
Прога подсчитывает, сколько раз подряд встречается очередной байт (Key) из входного файла, и пишет в выходной файл соответсвующий байт из массива Alternative[Key], за которым идёт байт со значением [3], если Key повторился 1 раз, или байты [2], [Num], [3], если Key повторился Num раз. Довольно-таки странный алгоритм, с ещё более странной реализацией, которая ломается, если Key повторится более чем 255 раз, или если Key будет повторятся на границе блока в 1024 байт, но во всяком случае в файл записывается всё верно. Что действительно непонятно, так это при чём тут Хаффман )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#5 |
Регистрация: 04.01.2011
Сообщений: 4
|
![]()
По Хаффманскому алгоритму я получаю альтернативы для каждого байта (для этого разумеется считаю частоту вхождения всех байтов) и потом хочу записать эти последовательности нулей и единиц в файл. Но как я уже не пробовал, новый файл получаю либо намного больше прежнего, либо точно такого же размера
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
просто надо работать на уровне бит, а у тебя вся работа идёт с байтами (8 бит).
Хаффманские альтернативы, насколько я помню, могут быть от 2 до, скажем, 32 бит каждая. Вот и надо их записывать как цепочку бит, а не как целый байт каждый раз. Могу только порекомендовать выкинуть всё, что уже написано, и начать заново. Сделать процедуру записи цепочки бит в файл. И вызывать её по мере поступления данных, передавая ей указатель на биты и количество бит, которое надо записать (от 1 до 32, например). Процедура эта, по мере накопления бит, будет сбрасывать их в файл, и тут уже работа будет с байтами. Возможно, проще окажется преобразовывать биты в строку, и работать со строкой бит (каждый символ строки будет или '0' или '1'), добавляя новые биты в конец строки простым сложением строк. Это менее эффективно, зато наглядно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#7 |
Регистрация: 04.01.2011
Сообщений: 4
|
![]()
Можно пример кода для работы с битами? Если есть
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Получение данных переменной ввиде массива байтов | chertovich | Общие вопросы Delphi | 3 | 18.12.2010 21:51 |
Запись массива в функцию | RobinVit | Общие вопросы C/C++ | 9 | 02.05.2010 23:43 |
Данные из буфера обмена в виде массива байтов | eda | Microsoft Office Excel | 10 | 12.08.2009 17:00 |
Запись массива в txt | yura-cat | Помощь студентам | 5 | 20.10.2008 23:54 |
запись Массива в БД | Chepa | БД в Delphi | 4 | 26.12.2006 18:58 |