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