|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 539
|
|
Как сжать двоичный файл15.01.2016, 16:49. Показов 3762. Ответов 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
Сообщений: 539
|
|
| 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
Сообщений: 539
|
|
| 16.01.2016, 14:30 [ТС] | |
|
Да, в файл так и писал 1 и 0. Да, как раз мне это и нужно как писать биты в файл, надеюсь что поможет, спасибо. Как только найду решение - сюда отпишусь.
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|||
| 16.01.2016, 14:50 | |||
|
0
|
|||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 539
|
|
| 16.01.2016, 16:20 [ТС] | |
|
Да, сейчас читаю как писать биты в файл, надеюсь что поможет. Потом ещё буду делать обратную задачу - по битовой последовательности восстанавливать исходный текст.
Добавлено через 1 час 21 минуту Похоже что надо использовать функции pack() и unpack(). С pack() вроде бы разобрался, а вот с unpack() пока возникают сложности...
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||||||
| 16.01.2016, 17:12 | ||||||
0
|
||||||
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 539
|
|
| 17.01.2016, 18:13 [ТС] | |
|
Shamil1 а у тебя нет примера на php. У меня всё на php реализовано.
Добавлено через 50 минут Тут как то надо битовую арифметику применить, а как - не знаю ((
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||||||
| 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
Сообщений: 539
|
||||||||||||||||
| 19.01.2016, 10:56 [ТС] | ||||||||||||||||
|
Я пробовал использовать и битовый сдвиг, и функцию bindec. Вот например у меня есть строка:
Добавлено через 12 минут Я левому узлу давал "0", а правому "1". Сейчас исправил. Если в дереве давать левому узлу "1", а правому "0", тогда тоже бывают ситуации, когда в начале строки нули появляются (((. Пока так решение и не нашёл. Добавлено через 1 час 48 минут Ещё и декодировать не получается. Наверно метод обхода дерева Хаффмана для декодирования неверно составил, народ, гляньте пожалуйста: //Метод получения символа из бинарного кода
0
|
||||||||||||||||
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
|
| 19.01.2016, 12:06 | |
|
Число бит в массиве байт кратно 8. Если Вы в последний байт записали меньше 8 бит, то "лишнее" место будет занято нулями. Нужно что-то придумать, чтобы лишние нули не искажали Ваш текст.
Например, добавьте в алфавит символ "конец текста" и игнорируйте все биты после него. И определите строго, как (в каком порядке) Вы храните биты в байтовом массиве. Я предлагаю естественный порядок: байты сначала младшие (первые), биты сначала старшие (первые). Но Вы выбирайте тот порядок, который удобен Вам. Добавлено через 5 минут Напишите класс с методами: добавить бит получить биты добавить байты получить байты
0
|
|
|
4 / 4 / 2
Регистрация: 09.10.2009
Сообщений: 539
|
|
| 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
Сообщений: 539
|
|
| 19.01.2016, 13:33 [ТС] | |
|
А JavaScript подойдёт для этого? Мне нужно для веб. Нужно чтобы пользователь мог загружать на страницу текстовый файл (*.txt), а на серверной стороне чтобы выполнялось его сжатие по алгоритму Хаффмана. Чтобы потом пользователь мог скачать упакованную версию этого файла. И наоборот, чтобы пользователь мог загружать упакованный файл, на сервере он бы обрабатывался, и выдавался бы *.txt-файл.
0
|
|
|
Модератор
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,878
|
||
| 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
Сообщений: 539
|
|
| 19.01.2016, 15:32 [ТС] | |
|
Ага, а если уникальных слов сотня, и не одна, тогда что?
0
|
|
| 19.01.2016, 15:32 | |
|
Помогаю со студенческими работами здесь
20
Как выгрузить двоичный файл?
Как сохранить двоичный файл в строку? Как считать двоичный файл в массив? Текстовый файл перевести в двоичный, а потом полученный двоичный файл перевести обратно в текстовый Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|