Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
| Client |
27.03.2011 14:01
Сообщение
#1
|
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
Привет!
решил сделать программку для архивации и... сейчас есть 2 проблемки: 1) начал считывать файл через blockread и получаю ошибку I/O 998. ошибка доступа, но почему? файл создался и в корне диска и в папке с проектом. procedure TForm1.Button2Click(Sender: TObject); var 2)пока до этого не дошел, но.. какой у меня будет выигрыш? Допустим, есть текстовый файл, я его прочитал, составил таблицу частот символов, построил дерево, а потом что? у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком? |
![]() ![]() |
| volvo |
27.03.2011 14:18
Сообщение
#2
|
|
Гость |
Следи за руками:
var Цитата у меня получатся цепочки из 3-х бит и более, но как мне записать именно эти 3 бита а не байт целиком? Значит записывай эти 3 бита в буферный байт, потом следующие 3 бита, и так, пока не наберется 8 бит. Набралось - сбрасываешь буфер в файл, и продолжаешь... shl/shr + and/or в помощь... |
| Client |
27.03.2011 15:27
Сообщение
#3
|
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
спасибо.
а как тогда мне различать где символ начинается/заканчивается. Ведь один символ может занимать 3 бита, второй - 4, как тогда сделать "границу" между ними? или лучше выбрать какой-нибудь другой способ записи данных? |
| volvo |
27.03.2011 20:01
Сообщение
#4
|
|
Гость |
Ты какой алгоритм архивации реализовать задумал?
|
| Client |
28.03.2011 7:41
Сообщение
#5
|
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
метод Хаффмана
|
| volvo |
28.03.2011 13:54
Сообщение
#6
|
|
Гость |
В адаптивном алгоритме Хаффмана, например, чтение из входного потока осуществляется вообще побитно, и, в зависимости от прочитанного значения, производится то лил иное действие. То есть, если тебе надо прочесть 3 бита - то ты и прочтешь именно 3. Не надо никаких границ...
|
| Client |
1.04.2011 15:38
Сообщение
#7
|
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
побитно? т.е. сначала считал байт и разбил его или прям побитно? по-моему меньше байта нельзя прочитать
хм, ну так в теории вроде понятно, что я записал в файл я и прочитаю. но все равно я не понял например, есть (101)(10)(0101)(011)(1011)(1001)(1011) в скобках "короткий символ". Вот читаю 1 байт, прохожу по битам, смотрю 101, да он совпадает, в таблице есть такая цепочка бит, можно читать дальше. Но, если взять еще 1 бит, будет 1011. Такая кодировка символа тоже есть в таблице. И дальше больше. Этот момент я не пойму как разобрать Сообщение отредактировано: Client - 1.04.2011 15:38 |
| Гость |
1.04.2011 16:21
Сообщение
#8
|
|
Гость |
> по-моему меньше байта нельзя прочитать
Используй абстракции. Напиши класс, читающий побитово. Внутри он читает блоками по 4096 байт, но при наружу он выдаёт очередной бит и увеличивает внутренний счётчик. > Но, если взять еще 1 бит, будет 1011 Нет, будет 100101. |
| Client |
1.04.2011 16:52
Сообщение
#9
|
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: 20 |
Цитата Нет, будет 100101 хм, а как получил?я взял 4-й бит и добавил к трем предыдущим и получилось 101+1 = 1011. |
| -TarasBer- |
1.04.2011 20:16
Сообщение
#10
|
|
Гость |
А, ты про это.
Не, суть шифра хаффмана такова, что никакой код не может быть началом другого кода (это называется префиксный код). (я просто подумал, что ты взял начало следующего байта, и взял то, что начинается с 4 бита, короче, проехали) |
![]() ![]() |
|
Текстовая версия | 10.12.2025 20:44 |