Название: Может кто смог бы написать обёртку над 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) |