Quelle est la meilleure façon de créer un patch pour un fichier binaire? Je veux que ce soit simple à appliquer pour les utilisateurs (une simple application patch
serait bien). L'exécution de diff sur le fichier donne simplement Binary files [...] differ
Découvrez bsdiff
et bspatch
( site Web , page de manuel , papier , fourche GitHub ).
Pour installer cet outil:
bzip2.exe
in PATH
; téléchargez-le depuis le lien "Binaires" ici .bsdiff
.bsdiff
.Courgette , par l'équipe Google Chrome, ressemble à l'outil le plus efficace pour les exécutables de correctifs binaires.
Pour citer leurs données:
Voici les tailles de la récente mise à jour 190.1 -> 190.4 sur le canal développeur:
- Mise à jour complète: 10 385 920 octets
- Mise à jour bsdiff: 704 512 octets
- Mise à jour Courgette: 78848 octets
Voici instructions pour le construire . Voici n binaire Windows de 2018 avec l'aimable autorisation de Mehrdad .
xdelta ( website , GitHub ) est une autre option. Il semble être plus récent, mais sinon je n'ai aucune idée de la façon dont il se compare à d'autres outils comme bsdiff.
Usage:
xdelta -e -s old_file new_file delta_file
xdelta -d -s old_file delta_file decoded_new_file
Installation:
choco install xdelta3
brew install xdelta
xdelta
ou xdelta3
dans votre gestionnaire de paquets.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 pu le compiler hors de la boîte (avec Visual Studio, par exemple 2013). (La source C++ ailleurs est un peu dépassée et nécessite au moins un peu de polissage et n'est que de 32 bits, ce qui définit les limites de la mémoire réelle (taille de la source diff). Il s'agit d'un port de ce code C++ bsdiff et teste même si les résultats du correctif sont identiques au code d'origine).
Autre idée: avec .NET 4.5, vous pourriez même vous débarrasser de la librairie #Zip, 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 minutes), et le temps critique pour moi n'est que 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 l'assume. La version compatible x64 ("Any CPU") fonctionne au moins. Essayé avec un fichier de 100 Mo.
- En outre: Le projet Google cité "Courgette" peut être le meilleur choix si votre cible principale est des fichiers exécutables. Mais il est nécessaire de le construire (pour les mesures Windows, au moins), et pour les fichiers binaires, il utilise également pur bsdiff/bspatch, pour autant que j'ai compris le doc.
Pour les petits correctifs simples, il est plus simple de dire à diff de traiter les fichiers comme du texte avec l'option -a (ou --text). Pour autant que je comprends, les différences binaires plus compliquées ne sont utiles que pour réduire la taille des correctifs.
$ man diff | grep -B1 "as text"
-a, --text
treat all files as text
$ diff old new
Binary files old and new differ
$ diff -a old new > old.patch
$ patch < old.patch old
patching file old
$ diff old new
$
Si les fichiers sont de la même taille et que le correctif ne modifie que quelques octets, vous pouvez utiliser xxd, qui est couramment installé avec le système d'exploitation. Ce qui suit convertit chaque fichier en une représentation hexadécimale avec un octet par ligne, puis diffère les fichiers pour créer un correctif compact, puis applique le correctif.
$ xxd -c1 old > old.hex
$ xxd -c1 new > new.hex
$ diff old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$