2009-12-22 2 views
40

Каков наилучший способ сделать патч для двоичного файла? Я хочу, чтобы это было просто для пользователей, чтобы применить (простое приложение patch было бы неплохо). Запуск диф на файл просто дает Binary files [...] differКак создать двоичные патчи?

+0

Связанный: http://stackoverflow.com/questions/688504/binary-diff-tool – miku

+1

Примечание: вопрос http://stackoverflow.com/questions/688504/binary-diff-tool-for-very-large -файлы для Windows только – Tino

ответ

33

Если использовать что-то другое, чем стандартный patch вариант для вас, вы можете проверить bsdiff и bspatch:

http://www.daemonology.net/bsdiff/

bsdiff и bspatch являются инструментами для создания и применения патчей к двоичным файлам. [...]

+2

Довольно старый источник. Нелегко скомпилировать с современной Visual Studio - с VS 2009 он работал, но я получил ошибки с более новыми версиями. Кроме того, это всего лишь 32-разрядный - это реальная проблема, связанная с потреблением памяти (см. Другие ответы). Я не уверен, что если просто компилировать с исправлениями x64 это, я переключился на порт .NET, см. Другой ответ. – Philm

+0

'bsdiff' и' courgette' оптимизированы для исполняемых двоичных файлов; нашел некоторые [неофициальные двоичные файлы Windows] (http://tpokorra.blogspot.cz/2007/11/bsdiff-for-windows-and-net.html), но он сразу же удался –

0

Предполагая, что вы знаете структуру файла, который вы могли бы использовать C/C++ программы, чтобы изменить его побайтно:

http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx

Просто читайте в старом файле, и напишите новый, который вам понравился.

Не забудьте указать номер версии файла в файле, чтобы вы знали, как читать какую-либо версию формата файла.

+2

Это решение безумно. Использование C/C++, когда 'sed' уже делает все, что вы когда-либо хотели. Или, если вы предпочтете использовать портативный язык программирования для промышленной прочности, 'perl' лучше всего. Если я пишу микропрограмму маршрутизатора, конечно, я поеду с C или C++, но все равно ...? –

13

Google Courgette tool выглядит как наиболее эффективный инструмент для бинарных патчей дифф

comparing with bsdiff - в 10 раз меньше патч!

обновление bsdiff 704.512

обновление Цуккини 78.848

+3

В документе говорится: «Мы написали новый алгоритм разложения, который знает больше о том, какие данные мы нажимаем - большие файлы, содержащие скомпилированные исполняемые файлы». Следствием этого является то, что он не будет работать (или, может быть, совсем нет) для других двоичных файлов. – James

+2

Благодарим вас за эту ссылку. Но это реальная история, чтобы собрать ее под Windows. Сначала он устанавливает всю систему разработчика, например. Git, Python и т. Д. Возможно, это работает, но на моей машине выборка использовала некоторые порты, которые были защищены и провалились. Кто-нибудь знает ссылку для бинарной загрузки? – Philm

+0

@James Courgette - настоящий преемник 'bsdiff'. Из документа: Courgette 'diff = bsdiff (concat (original, guess), update)'. С разумным алгоритмом 'bdiff' вы имеете' len (bdiff (concat (original, guess), update)) Tino

3

Современный порт: Очень полезный .NET порт для bsdiff/bspatch:

https://github.com/LogosBible/bsdiff.net

Мой личный выбор. Я протестировал его, и это был единственный из всех ссылок, я был в состоянии скомпилировать его (с Visual Studio, например, 2013). (Источник C++ в другом месте немного устарел и требует по крайней мере бит полирования и составляет всего 32 бит, который устанавливает пределы реальной памяти (размер источника). Это порт этого кода на C++ bsdiff и даже тесты, если результаты патча идентичны к исходному коду).

Дополнительная идея: С .NET 4.5 вы даже можете избавиться от #Zip lib, которая здесь является зависимой.

Я не оценил, если он немного медленнее, чем код C++, но он отлично работал для меня (bsdiff: 90 МБ файла за 1-2 мин.), А для меня критически важно только bspatch , а не bsdiff.

Я не уверен, если используется вся память машины x64, но я предполагаю это. Конструкция с поддержкой x64 («Любой процессор») работает как минимум. Пробовал файл размером 100 МБ.

- Кроме того: цитируемый проект Google «Цуккерт» может быть лучшим выбором, если ваша основная цель - это исполняемые файлы. Но это - работа по его созданию (по крайней мере, для Windows), а для двоичных файлов также используется чистая bsdiff/bspatch, насколько я понял документ.

9

xdelta - еще один вариант.

make patch: 

    xdelta3.exe -e -s old_file new_file delta_file 

apply patch: 

    xdelta3.exe -d -s old_file delta_file decoded_new_file 

Он доступен на макинтош через доморощенного: brew install xdelta

Это, кажется, более поздние, но в остальном я понятия не имею, как он сравнивает с другими инструментами, такими как bsdiff.

+0

Бинарные файлы Windows: [официальный xdelta3] (https://github.com/jmacd/xdelta-gpl/releases), [неофициальный xdelta] (http://www.evanjones.ca/software/xdelta-win32.html). –

Смежные вопросы