IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> архивация
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Привет!
решил сделать программку для архивации и... сейчас есть 2 проблемки:
1) начал считывать файл через blockread и получаю ошибку I/O 998. ошибка доступа, но почему? файл создался и в корне диска и в папке с проектом.
procedure TForm1.Button2Click(Sender: TObject);
var
f : file;
buf : array [0..255] of Char;
begin
AssignFile(f, 'D:\asd.bin');
Reset(f);
BlockRead(f, buf, 250); <-- тут вылазит ошибка sad.gif
Memo1.Text := buf;
CloseFile(f);
end;


2)пока до этого не дошел, но.. какой у меня будет выигрыш? Допустим, есть текстовый файл, я его прочитал, составил таблицу частот символов, построил дерево, а потом что? у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
сообщение
Сообщение #2


Гость






Следи за руками:
var
buf : array [0..255] of Char; // Хранилище на 250 байт
// ...
Reset(f); // Открыли файл. Дефолтный размер одного блока = 128 байт
BlockRead(f, buf, 250); // читаем 250 блоков = 32К. Что ты ожидаешь увидеть, кроме ошибки?


Цитата
у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком?
Значит записывай эти 3 бита в буферный байт, потом следующие 3 бита, и так, пока не наберется 8 бит. Набралось - сбрасываешь буфер в файл, и продолжаешь... shl/shr + and/or в помощь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


спасибо.

а как тогда мне различать где символ начинается/заканчивается. Ведь один символ может занимать 3 бита, второй - 4, как тогда сделать "границу" между ними?

или лучше выбрать какой-нибудь другой способ записи данных?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ты какой алгоритм архивации реализовать задумал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


метод Хаффмана
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






В адаптивном алгоритме Хаффмана, например, чтение из входного потока осуществляется вообще побитно, и, в зависимости от прочитанного значения, производится то лил иное действие. То есть, если тебе надо прочесть 3 бита - то ты и прочтешь именно 3. Не надо никаких границ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


побитно? т.е. сначала считал байт и разбил его или прям побитно? по-моему меньше байта нельзя прочитать

хм, ну так в теории вроде понятно, что я записал в файл я и прочитаю. но все равно я не понял
например, есть (101)(10)(0101)(011)(1011)(1001)(1011) в скобках "короткий символ".
Вот читаю 1 байт, прохожу по битам, смотрю 101, да он совпадает, в таблице есть такая цепочка бит, можно читать дальше. Но, если взять еще 1 бит, будет 1011. Такая кодировка символа тоже есть в таблице. И дальше больше.

Этот момент я не пойму как разобрать

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






> по-моему меньше байта нельзя прочитать

Используй абстракции. Напиши класс, читающий побитово. Внутри он читает блоками по 4096 байт, но при наружу он выдаёт очередной бит и увеличивает внутренний счётчик.

> Но, если взять еще 1 бит, будет 1011

Нет, будет 100101.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Цитата
Нет, будет 100101
хм, а как получил?
я взял 4-й бит и добавил к трем предыдущим и получилось 101+1 = 1011.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






А, ты про это.

Не, суть шифра хаффмана такова, что никакой код не может быть началом другого кода (это называется префиксный код).

(я просто подумал, что ты взял начало следующего байта, и взял то, что начинается с 4 бита, короче, проехали)
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.09.2025 6:47
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name