web-dev-qa-db-fra.com

Comment créer des patchs binaires?

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

51
Mike

Découvrez bsdiff et bspatch ( site Web , page de manuel , papier , fourche GitHub ).

Pour installer cet outil:

  • Windows: Téléchargez et extrayez ce package . Vous aurez également besoin d'une copie de bzip2.exe in PATH; téléchargez-le depuis le lien "Binaires" ici .
  • macOS: installez Homebrew et utilisez-le pour installer bsdiff.
  • Linux: utilisez votre gestionnaire de packages pour installer bsdiff.
45
Heinzi

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 .

18
Maxim Kholyavkin

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:

  • Création d'un patch: xdelta -e -s old_file new_file delta_file
  • Application d'un patch: xdelta -d -s old_file delta_file decoded_new_file

Installation:

  • Windows: Téléchargez le binaires officiels .
  • Chocolaté: choco install xdelta3
  • Homebrew: brew install xdelta
  • Linux: disponible en xdelta ou xdelta3 dans votre gestionnaire de paquets.
11
Jared Beck

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.

7
Philm

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
$
0
cjfp