Russian Qt Forum
Ноябрь 23, 2024, 03:18
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Дополнительные компоненты
>
Может кто смог бы написать обёртку над bsdiff для Qt?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Может кто смог бы написать обёртку над bsdiff для Qt? (Прочитано 7202 раз)
512es
Гость
Может кто смог бы написать обёртку над bsdiff для Qt?
«
:
Январь 18, 2012, 00:44 »
Доброе время суток!
Может кто смог бы написать обёртку над
bsdiff
для Qt?)
Вроде кода совсем немного, но для меня так запутано...
А главное, там пишут в файл через BZ2_bzWriteOpen, BZ2_bzWrite тоесть через библиотеку BZip2, сразу архивируя. А мне надо в QByteArray сохранить, можно уже запакованные данные...
Для Ruby например, уже есть
обёртка
Для питона есть даже
модуль
Ссылка на
исходник bsdiff
PS:
Цитировать
Утилита bsdiff сравнивает бинарные файлы старый_файл и новый_файл, и сохраняет найденные отличия в файл_патча в виде двоичного патча, пригодного для использования утилитой bspatch. В случае, когда старый_файл и новый_файл представляют собой две версии одной исполняемой программы, патчи получаются в среднем в пять раз меньше, чем с помощью аналогичных утилит, известных автору.
Записан
b-s-a
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #1 :
Январь 18, 2012, 10:32 »
А в чем проблема выдрать алгоритм из исходников, вместо записи в файл писать в буфер, после окончания создания патча сжать буфер с помощью
BZ2_bzBuffToBuffCompress
?
Записан
512es
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #2 :
Январь 18, 2012, 18:32 »
Вообщем, жутко не хотелось, но начал я перелопачивать код. Получается класс для Qt4, в котором уже реализован diff. Файл на выходе получается бинарно идентичный тому что создаёт оригинальная утилита bsdiff. Данные берутся из QByteArray и на выхоте тоже получаем QByteArray. Осталось только patch переделать.
Спасибо за совет, какраз вчера нагуглил уже BZ2_bzBuffToBuffCompress и заюзал.
Ещё как вариант хочу попробовать немного изменить формат выходного патч файла.
Поидее, можно значительно выиграть в скорости, если заменить архиватор с BZip2 на Zlib.
Вот
тут
сравнение этих алгоритмов.
Что ещё приятно, что Zlib встроен в Qt и не требует отдельной библиотеки.
qCompress() поидее должен работать быстрее. При том, в размее файла мы не сильно проиграем.
Записан
512es
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #3 :
Январь 18, 2012, 21:09 »
Невероятно, но при использовании zlib вместо BZip2 получился проигрыш и в скорости и по объёму полученного файла.
zlib (qCompress) 1.639 сек.
BZip2 1.531 сек.
При том что размер файла с zlib увеличился на 9кб.
Видимо алгоритм bsdiff хорошо заточен именно на использование BZip2.
Записан
512es
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #4 :
Январь 20, 2012, 04:04 »
Возник вопрос. Как через BZ2_bzBuffToBuffCompress запаковать буфер больше 64мб? Что бы получить бинарно идентичный файл на выходе как при использовании BZ2_bzWriteOpen + BZ2_bzWrite + BZ2_bzWriteClose?
Ведь если паковать блоками в данном случае, в конце и в начале блоков будут вставляться сигнатуры конца и начала архива.
А длины буферов поидее ограничены размерностью unsigned int...
Записан
mutineer
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #5 :
Январь 20, 2012, 11:46 »
Цитата: 512es от Январь 20, 2012, 04:04
А длины буферов поидее ограничены размерностью unsigned int...
Что у тебя за целевая платформа, где unsigned int 16-битный?
Записан
512es
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #6 :
Январь 23, 2012, 02:36 »
Цитата: mutineer от Январь 20, 2012, 11:46
Цитата: 512es от Январь 20, 2012, 04:04
А длины буферов поидее ограничены размерностью unsigned int...
Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))
Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?))
Ато я уж собирался искать в Qt специальный дефайн для интов...
*стыдно*
Записан
LisandreL
Птица говорун
Offline
Сообщений: 984
Надо улыбаться
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #7 :
Январь 23, 2012, 07:12 »
Цитата: 512es от Январь 23, 2012, 02:36
Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?
Зависит от того, какая именно архитектура используется. На основных целевых 64хбитных ОС (Win/Lin/Mac) int останется 32х битным.
Цитата: 512es от Январь 23, 2012, 02:36
Ато я уж собирался искать в Qt специальный дефайн для интов...
Если используется, например передача данных потоком (например TCP/IP) и надо гарантировать размерность, то лучше использовать именно дефайны: quint8/qint8, quint16/qint16, quint32/qint32, quint64/qint64.
Записан
mutineer
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #8 :
Январь 23, 2012, 11:45 »
Цитата: 512es от Январь 23, 2012, 02:36
Цитата: 512es от Январь 20, 2012, 04:04
Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))
Про платформу так и не сказал. Самый лучший способ проверить - qDebug() << sizeof(unsigned int);
Записан
512es
Гость
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #9 :
Январь 23, 2012, 17:03 »
Целевая платформа: IBM PC / Mac (intel) ОС: Win32, Lin32, Lin64, Mac64
qDebug() << sizeof(unsigned int);
Выдаёт 4 байта.
Т.е. unsigned int может принимать значения до 0xffffffff, т.е. ограничение около 4гб на файл.
Тогда впринципе можно так и оставить.
Хотя я уже переписал функции сжатия через low-level bzip2 api. Где сжатие выполняется блоками, а вконце финализируется.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Может кто смог бы написать обёртку над bsdiff для Qt?
«
Ответ #10 :
Январь 23, 2012, 19:38 »
Цитата: 512es от Январь 23, 2012, 02:36
Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?))
int нет а вот long может (на Mac OSX)
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...