2009-12-22 8 views
40

Quelle est la meilleure façon de créer un correctif pour un fichier binaire? Je veux qu'il soit simple pour les utilisateurs de postuler (une application simple patch serait bien). Exécution diff sur le fichier donne juste Binary files [...] differComment créer des correctifs binaires?

+0

Connexes: http://stackoverflow.com/questions/688504/binary-diff-tool – miku

+1

Note: La question http://stackoverflow.com/questions/688504/binary-diff-tool-for-very-large -files est pour Windows seulement – Tino

Répondre

33

Si vous utilisez quelque chose d'autre que le patch standard est une option pour vous, vous pouvez consulter bsdiff et bspatch:

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

bsdiff et bspatch sont des outils pour construire et appliquer des correctifs aux fichiers binaires. [...]

+2

Source assez ancienne. Il n'est pas facile de compiler avec Visual Studio moderne - avec VS 2009 cela a fonctionné, mais j'ai eu des erreurs avec des versions plus récentes. De plus, il ne s'agit que de 32 bits, ce qui est un vrai problème concernant la consommation de mémoire (voir les autres réponses). Je ne suis pas sûr, si juste compiler avec x64 corrige ceci- je suis passé à un port. NET, voir l'autre réponse. – Philm

+0

'bsdiff' et' courgette' sont optimisés pour les binaires exécutables; trouvé quelques [binaires Windows non officiels] (http://tpokorra.blogspot.cz/2007/11/bsdiff-for-windows-and-net.html), mais il a échoué immédiatement –

0

En supposant que vous connaissez la structure du fichier que vous pouvez utiliser ac/C++ programme pour le modifier octet par octet:

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

Il suffit de lire dans l'ancien fichier, et écrivez un nouveau modifié comme vous voulez. N'oubliez pas d'inclure un numéro de version de format de fichier dans le fichier afin de savoir comment lire une version donnée du format de fichier.

+2

Cette solution est folle. Utiliser C/C++ quand 'sed' fait déjà tout ce que vous voulez. Ou, si vous préférez utiliser un langage de programmation portable de niveau industriel, 'perl' est votre meilleur choix. Si j'écris le firmware du routeur, bien sûr, je vais utiliser C ou C++, mais en différant ...? –

13

Google Courgette tool ressemble le plus efficace outil pour les patchs diff binaires

comparing with bsdiff - 10 fois plus petit patch!

bsdiff mise à jour 704.512

Courgette mise à jour 78.848

+3

Le document dit, "nous avons écrit un nouvel algorithme de diff qui en sait plus sur le type de données que nous poussons - de gros fichiers contenant des exécutables compilés". L'implication est que cela ne fonctionnera pas aussi bien (ou peut-être pas du tout) pour les autres fichiers binaires. – James

+2

Merci pour ce lien. Mais c'est une histoire vraie pour la compiler sous Windows. Il installe d'abord un système de développement complet, par ex. Git, Python, etc. Peut-être que cela fonctionne, mais sur ma machine, le fetch a utilisé certains ports qui ont été sécurisés et qui ont échoué. Quelqu'un connaît un lien de téléchargement binaire? – Philm

+0

@ James Courgette est un véritable successeur de 'bsdiff'. Du document: Courgette 'diff = bsdiff (concat (original, devinez), mise à jour)'. Avec un algorithme 'bdiff' raisonnable vous avez' len (bdiff (concat (original, devinez), update)) Tino

3

port moderne: Port .NET Très utile pour bsdiff/bspatch:

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

Mon choix personnel. Je l'ai testé, et c'était le seul de tous les liens, j'ai été capable de le compiler (avec Visual Studio, par exemple, 2013). (La source C++ ailleurs est un peu obsolète et a besoin d'au moins un peu de polissage et ne fait que 32 bits qui définit les limites réelles de la mémoire (taille de la source diff), c'est un portage de ce code bsdiff au code original). Idée supplémentaire: Avec .NET 4.5, vous pouvez même vous débarrasser de #Zip lib, qui est une dépendance ici.

Je n'ai pas mesuré s'il est légèrement plus lent que le code C++, mais cela a bien fonctionné pour moi, (bsdiff: fichier de 90 Mo en 1-2 min.), Et le temps critique pour moi est seulement le bspatch , pas le bsdiff.

Je ne suis pas vraiment sûr, si toute la mémoire d'une machine x64 est utilisée, mais je suppose. La construction capable x64 ("Any CPU") fonctionne au moins. Essayé avec un fichier de 100 Mo. En outre: Le projet Google Courgette cité peut être le meilleur choix si votre cible principale est des fichiers exécutables. Mais c'est un travail pour le construire (pour les mesures de Windows, au moins), et pour les fichiers binaires, il utilise aussi bsdiff/bspatch pur, autant que j'ai compris le doc.

9

xdelta est une autre option.

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 

Il est disponible sur le Mac via homebrew: brew install xdelta

Il semble être plus récente, mais sinon je ne sais pas comment il se compare à d'autres outils tels que bsdiff.

+0

Binaires Windows: [officiel xdelta3] (https://github.com/jmacd/xdelta-gpl/releases), [non officiel xdelta] (http://www.evanjones.ca/software/xdelta-win32.html). –

Questions connexes