|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
Как сжать двоичный файл15.01.2016, 16:49. Показов 3689. Ответов 28
Метки нет (Все метки)
Всем привет народ. Вот такой вопрос.
По Алгоритму Хаффмана я закодировал входную строку (текст). Получил 0 и 1. Построил таблицу частот символов, и само дерево Хаффмана. Потом записываю эти 0 и 1 в txt-файл, НО размер txt-файла, содержащего 0 и 1 превышает размер файла с исходным текстом. В общем я реализовал только кодирование по алгоритму Хаффмана, получил нули и единицы. Мне в конечном итоге нужно получить из исходного текстового файла - его упакованную версию (само собой с меньшим размером). Потом уже буду из упакованной версии файла восстанавливать исходную строку символов. Помогите, в какую сторону копать? Например txt-файл, содержащий строку "test_string" занимает размер 11 байт, а файл, где каждый символ заменён на нули и единицы занимает 32 байта ((((
0
|
|
| 15.01.2016, 16:49 | |
|
Ответы с готовыми решениями:
28
Как сжать exe-файл? Как можно сжать текстовый файл? Как или чем максимально сжать файл? |
|
Кандёхаем веселее!
296 / 330 / 76
Регистрация: 02.10.2012
Сообщений: 2,175
|
|
| 15.01.2016, 23:57 | |
|
Наверное, вышло больше из-за хранения метаинформации в файле: инфа о том, какой символ кодируется какой последовательностью тоже что-то весит, но если закодировать много текста, её доля будет практически незаметной.
0
|
|
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 16.01.2016, 10:18 [ТС] | |
|
Ну пока всё не так, входную последовательность символов я просто заменил нулями и единицами, 0 и 1 стало больше, чем самих символов. Я не знаю что мне делать дальше с этим txt-файлом, содержащим 0 и 1 чтобы реально его сжать. Таблица частот символов, и само дерево Хаффмана хранится в php-переменных. Реализовывал всё на php.
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
|
| 16.01.2016, 13:39 | |
|
Вы в файл так и писали 1 и 0?
Тогда логично что он больше. Так как вы закодировали байт битом, но записали его как код символа 0 и 1 то есть опять байтом. Почитайте как в php писать биты в файл, скорее всего есть статьи об этом.
0
|
|
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 16.01.2016, 14:30 [ТС] | |
|
Да, в файл так и писал 1 и 0. Да, как раз мне это и нужно как писать биты в файл, надеюсь что поможет, спасибо. Как только найду решение - сюда отпишусь.
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||
| 16.01.2016, 14:50 | |||
|
0
|
|||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 16.01.2016, 16:20 [ТС] | |
|
Да, сейчас читаю как писать биты в файл, надеюсь что поможет. Потом ещё буду делать обратную задачу - по битовой последовательности восстанавливать исходный текст.
Добавлено через 1 час 21 минуту Похоже что надо использовать функции pack() и unpack(). С pack() вроде бы разобрался, а вот с unpack() пока возникают сложности...
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||||||
| 16.01.2016, 17:12 | ||||||
0
|
||||||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 17.01.2016, 18:13 [ТС] | |
|
Shamil1 а у тебя нет примера на php. У меня всё на php реализовано.
Добавлено через 50 минут Тут как то надо битовую арифметику применить, а как - не знаю ((
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||||||
| 17.01.2016, 18:31 | ||||||
|
На пхп не писал никогда. Используйте битовый сдвиг.
0
|
||||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 18.01.2016, 14:32 | ||
|
пусть у тебя строка s[i] из символов "0" и "1" в количестве 8 штук заводим числовую переменную х = 0 далее по всем символам в строке S цикл: х = (побитовый сдвиг влево на единицу в переменной Х) х = (перевод s[i] в целое число) + Х Добавлено через 4 минуты может это - функция bindec ? http://php.net/manual/ru/function.bindec.php
0
|
||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
||||||||||||||||
| 19.01.2016, 10:56 [ТС] | ||||||||||||||||
|
Я пробовал использовать и битовый сдвиг, и функцию bindec. Вот например у меня есть строка:
Добавлено через 12 минут Я левому узлу давал "0", а правому "1". Сейчас исправил. Если в дереве давать левому узлу "1", а правому "0", тогда тоже бывают ситуации, когда в начале строки нули появляются (((. Пока так решение и не нашёл. Добавлено через 1 час 48 минут Ещё и декодировать не получается. Наверно метод обхода дерева Хаффмана для декодирования неверно составил, народ, гляньте пожалуйста: //Метод получения символа из бинарного кода
0
|
||||||||||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|
| 19.01.2016, 12:06 | |
|
Число бит в массиве байт кратно 8. Если Вы в последний байт записали меньше 8 бит, то "лишнее" место будет занято нулями. Нужно что-то придумать, чтобы лишние нули не искажали Ваш текст.
Например, добавьте в алфавит символ "конец текста" и игнорируйте все биты после него. И определите строго, как (в каком порядке) Вы храните биты в байтовом массиве. Я предлагаю естественный порядок: байты сначала младшие (первые), биты сначала старшие (первые). Но Вы выбирайте тот порядок, который удобен Вам. Добавлено через 5 минут Напишите класс с методами: добавить бит получить биты добавить байты получить байты
0
|
|
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 19.01.2016, 13:06 [ТС] | |
|
Я не понимаю зачем это нужно? У меня те нули, которые в начале строки - они пропадают при выполнении операции битового сдвига. Как мне эти нули сохранить?
Если например входная строка=010000011011, то как мне сохранить 1-й символ? 010000011011 Операция арифметического сдвига нормально работает, но если выполнять обратную ей операцию - из десятичного числа получить двоичное, то получится 10000011011. Ноль в начале пропускается.
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
||
| 19.01.2016, 13:22 | ||
|
Вам в файл надо писать
1) Таблицу символ - код 2) Длину тела 3) Само тело Я в своё время разделял разделы структуры двумя нулевыми байтами. PHP для этой задачи вам не подходит. Да и C# не кайф, там приходится работать с массивом bool значений.
Комп видит число как 00000100 00011011. Ваша задача записать реальную длину строчки. И дополнить строку до целого байта. 0100 0001 1011 0000 И да, кто вам сказал что он теряет ноль?
0
|
||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 19.01.2016, 13:33 [ТС] | |
|
А JavaScript подойдёт для этого? Мне нужно для веб. Нужно чтобы пользователь мог загружать на страницу текстовый файл (*.txt), а на серверной стороне чтобы выполнялось его сжатие по алгоритму Хаффмана. Чтобы потом пользователь мог скачать упакованную версию этого файла. И наоборот, чтобы пользователь мог загружать упакованный файл, на сервере он бы обрабатывался, и выдавался бы *.txt-файл.
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 19.01.2016, 13:41 | ||
|
0
|
||
|
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
|
|
| 19.01.2016, 15:24 | |
|
Хм.. что за хафман.. =).
Я бы просмотрел весь текст на уникальные слова, затем каждому слову присвоил число. В итоге от уровня заумности текста будет зависит размер сжатого фаила. В итоге будет не кодировка битов а кодировка целых слов: “Я бы просмотрел весь текст на уникальные слова ” будет код типа: “1 2 3 4 5 6 7 8”
0
|
|
|
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
|
||
| 19.01.2016, 15:31 | ||
|
0
|
||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 524
|
|
| 19.01.2016, 15:32 [ТС] | |
|
Ага, а если уникальных слов сотня, и не одна, тогда что?
0
|
|
| 19.01.2016, 15:32 | |
|
Помогаю со студенческими работами здесь
20
Как выгрузить двоичный файл?
Как сохранить двоичный файл в строку? Как считать двоичный файл в массив? Текстовый файл перевести в двоичный, а потом полученный двоичный файл перевести обратно в текстовый Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|