Russian Qt Forum
Май 15, 2024, 12:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Может кто смог бы написать обёртку над bsdiff для Qt?  (Прочитано 6974 раз)
512es
Гость
« : Январь 18, 2012, 00:44 »

Доброе время суток!

Может кто смог бы написать обёртку над bsdiff для Qt?)

Вроде кода совсем немного, но для меня так запутано...
А главное, там пишут в файл через BZ2_bzWriteOpen, BZ2_bzWrite тоесть через библиотеку BZip2, сразу архивируя. А мне надо в QByteArray сохранить, можно уже запакованные данные...

Для Ruby например, уже есть обёртка
Для питона есть даже модуль
Ссылка на исходник bsdiff

PS:
Цитировать
Утилита bsdiff сравнивает бинарные файлы старый_файл и новый_файл, и сохраняет найденные отличия в файл_патча в виде двоичного патча, пригодного для использования утилитой bspatch. В случае, когда старый_файл и новый_файл представляют собой две версии одной исполняемой программы, патчи получаются в среднем в пять раз меньше, чем с помощью аналогичных утилит, известных автору.
Записан
b-s-a
Гость
« Ответ #1 : Январь 18, 2012, 10:32 »

А в чем проблема выдрать алгоритм из исходников, вместо записи в файл писать в буфер, после окончания создания патча сжать буфер с помощью BZ2_bzBuffToBuffCompress?
Записан
512es
Гость
« Ответ #2 : Январь 18, 2012, 18:32 »

Вообщем, жутко не хотелось, но начал я перелопачивать код. Получается класс для Qt4, в котором уже реализован diff. Файл на выходе получается бинарно идентичный тому что создаёт оригинальная утилита bsdiff. Данные берутся из QByteArray и на выхоте тоже получаем QByteArray. Осталось только patch переделать.

Спасибо за совет, какраз вчера нагуглил уже BZ2_bzBuffToBuffCompress и заюзал.

Ещё как вариант хочу попробовать немного изменить формат выходного патч файла.
Поидее, можно значительно выиграть в скорости, если заменить архиватор с BZip2 на Zlib.
Вот тут сравнение этих алгоритмов.

Что ещё приятно, что Zlib встроен в Qt и не требует отдельной библиотеки.
qCompress() поидее должен работать быстрее. При том, в размее файла мы не сильно проиграем.
Записан
512es
Гость
« Ответ #3 : Январь 18, 2012, 21:09 »

Невероятно, но при использовании zlib вместо BZip2 получился проигрыш и в скорости и по объёму полученного файла.

zlib (qCompress)          1.639 сек.
BZip2                         1.531 сек.

При том что размер файла с zlib увеличился на 9кб.

Видимо алгоритм bsdiff хорошо заточен именно на использование BZip2.
Записан
512es
Гость
« Ответ #4 : Январь 20, 2012, 04:04 »

Возник вопрос. Как через BZ2_bzBuffToBuffCompress запаковать буфер больше 64мб? Что бы получить бинарно идентичный файл на выходе как при использовании BZ2_bzWriteOpen + BZ2_bzWrite + BZ2_bzWriteClose?

Ведь если паковать блоками в данном случае, в конце и в начале блоков будут вставляться сигнатуры конца и начала архива.

А длины буферов поидее ограничены размерностью unsigned int...
Записан
mutineer
Гость
« Ответ #5 : Январь 20, 2012, 11:46 »

А длины буферов поидее ограничены размерностью unsigned int...

Что у тебя за целевая платформа, где unsigned int 16-битный?
Записан
512es
Гость
« Ответ #6 : Январь 23, 2012, 02:36 »

А длины буферов поидее ограничены размерностью unsigned int...
Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))

Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?))
Ато я уж собирался искать в Qt специальный дефайн для интов...

*стыдно*
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Январь 23, 2012, 07:12 »

Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?
Зависит от того, какая именно архитектура используется. На основных целевых 64хбитных ОС (Win/Lin/Mac) int останется 32х битным.

Ато я уж собирался искать в Qt специальный дефайн для интов...
Если используется, например передача данных потоком (например TCP/IP) и надо гарантировать размерность, то лучше использовать именно дефайны: quint8/qint8, quint16/qint16, quint32/qint32, quint64/qint64.
Записан
mutineer
Гость
« Ответ #8 : Январь 23, 2012, 11:45 »

Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))


Про платформу так и не сказал. Самый лучший способ проверить - qDebug() << sizeof(unsigned int);
Записан
512es
Гость
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Январь 23, 2012, 19:38 »

Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?))
int нет а вот long может (на Mac OSX)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 22.