Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: 512es от Январь 18, 2012, 00:44



Название: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 18, 2012, 00:44
Доброе время суток!

Может кто смог бы написать обёртку над bsdiff (http://www.daemonology.net/bsdiff/) для Qt?)

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

Для Ruby например, уже есть обёртка (https://github.com/taf2/rb-bsdiff)
Для питона есть даже модуль (http://starship.python.net/crew/atuining/cx_bsdiff/index.html)
Ссылка на исходник bsdiff (http://www.daemonology.net/bsdiff/bsdiff-4.3.tar.gz)

PS:
Цитировать
Утилита bsdiff сравнивает бинарные файлы старый_файл и новый_файл, и сохраняет найденные отличия в файл_патча в виде двоичного патча, пригодного для использования утилитой bspatch. В случае, когда старый_файл и новый_файл представляют собой две версии одной исполняемой программы, патчи получаются в среднем в пять раз меньше, чем с помощью аналогичных утилит, известных автору.


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: b-s-a от Январь 18, 2012, 10:32
А в чем проблема выдрать алгоритм из исходников, вместо записи в файл писать в буфер, после окончания создания патча сжать буфер с помощью BZ2_bzBuffToBuffCompress (http://bzip.org/1.0.5/bzip2-manual-1.0.5.html#bzbufftobuffcompress)?


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 18, 2012, 18:32
Вообщем, жутко не хотелось, но начал я перелопачивать код. Получается класс для Qt4, в котором уже реализован diff. Файл на выходе получается бинарно идентичный тому что создаёт оригинальная утилита bsdiff. Данные берутся из QByteArray и на выхоте тоже получаем QByteArray. Осталось только patch переделать.

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

Ещё как вариант хочу попробовать немного изменить формат выходного патч файла.
Поидее, можно значительно выиграть в скорости, если заменить архиватор с BZip2 на Zlib.
Вот тут (http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/) сравнение этих алгоритмов.

Что ещё приятно, что Zlib встроен в Qt и не требует отдельной библиотеки.
qCompress() поидее должен работать быстрее. При том, в размее файла мы не сильно проиграем.


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 18, 2012, 21:09
Невероятно, но при использовании zlib вместо BZip2 получился проигрыш и в скорости и по объёму полученного файла.

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

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

Видимо алгоритм bsdiff хорошо заточен именно на использование BZip2.


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 20, 2012, 04:04
Возник вопрос. Как через BZ2_bzBuffToBuffCompress запаковать буфер больше 64мб? Что бы получить бинарно идентичный файл на выходе как при использовании BZ2_bzWriteOpen + BZ2_bzWrite + BZ2_bzWriteClose?

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

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


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: mutineer от Январь 20, 2012, 11:46
А длины буферов поидее ограничены размерностью unsigned int...

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


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 23, 2012, 02:36
А длины буферов поидее ограничены размерностью unsigned int...
Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))

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

*стыдно*


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: LisandreL от Январь 23, 2012, 07:12
Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?
Зависит от того, какая именно архитектура используется. На основных целевых 64хбитных ОС (Win/Lin/Mac) int останется 32х битным.

Ато я уж собирался искать в Qt специальный дефайн для интов...
Если используется, например передача данных потоком (например TCP/IP) и надо гарантировать размерность, то лучше использовать именно дефайны: quint8/qint8, quint16/qint16, quint32/qint32, quint64/qint64.


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: mutineer от Январь 23, 2012, 11:45
Что у тебя за целевая платформа, где unsigned int 16-битный?
Эм.. Ну.. Это википедия так сказала... =))


Про платформу так и не сказал. Самый лучший способ проверить - qDebug() << sizeof(unsigned int);


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: 512es от Январь 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. Где сжатие выполняется блоками, а вконце финализируется.


Название: Re: Может кто смог бы написать обёртку над bsdiff для Qt?
Отправлено: Igors от Январь 23, 2012, 19:38
Кстати всегда мучал вопрос, когда программу собираешь под 64 бит, int тоже становится 64-битным?))
int нет а вот long может (на Mac OSX)