2016-10-16 1 views
0

Je vais produire des deltas binaires de fichiers de plusieurs gigaoctets.Existe-t-il un format populaire Linux/Unix pour les diffs binaires?

Naïvement, je l'intention d'utiliser le format suivant:

struct chunk { 
    uint64_t offset; 
    uint64_t length; 
    uint8_t data[]; 
}; 

struct delta { 
    uint8_t file_a_checksum[32]; // These are calculated while the 
    uint8_t file_b_checksum[32]; // gzipped chunks are being written 
    uint8_t chunks_checksum[32]; // at the 96 octet offset. 
    uint8_t gzipped_chunks[]; 
}; 

J'ai besoin que d'appliquer ces deltas à l'file_a d'origine qui a été utilisé pour générer un delta.

Y at-il quelque chose qui me manque ici?

Existe-t-il un format delta binaire existant qui possède les fonctionnalités que je recherche, mais qui n'est pas trop complexe?

+1

[VCDIFF] (https://fr.wikipedia.org/wiki/VCDIFF)? – hvd

+0

Merci, mais cela peut être exagéré car 99% des données sont inchangées et ne déplace jamais l'emplacement dans le fichier. – fadedbee

+0

Cela sera probablement le cas pour tout format delta binaire existant: s'il s'agit d'un format général, il ne sera pas optimisé pour votre cas d'utilisation particulier. Et si c'est un format très spécifique, vous aurez besoin d'un peu de chance pour quelqu'un d'expérimenté pour voir votre question. – hvd

Répondre

1

Pour les binaires arbitraires, bien sûr, il est logique d'utiliser un outil polyvalent:

  • xdelta
  • bspatch
  • rdiff-backup (rsync)
  • git diff

(Oui, git diff fonctionne sur les fichiers qui ne sont pas sous contrôle de version git diff --binary --no-index dir1/file.bin dir2/file.bin)

Je recommande habituellement un outil générique avant d'écrire le vôtre, même s'il y a un peu de frais généraux. Bien qu'aucun des outils de la liste ci-dessus ne produise des diffs binaires dans un format aussi omniprésent que le format «unifified diff», ils sont tous «proches» des outils standard.

Il existe un autre format assez standardisé qui pourrait vous intéresser: l'humble hexdump. L'outil xxd dépotoirs binaires dans un format de texte assez standard par défaut:

0000050: 2020 2020 5858 4428 3129 0a0a 0a0a 4e08  XXD(1)....N. 

C'est, OFFSET suivie d'une série de valeurs d'octets. Le format exact est flexible et configurable avec des commutateurs de ligne de commande.

Toutefois, xxd peut également être utilisé en mode inverse pour écrire ces octets au lieu de les jeter.

Donc, si vous avez un fichier appelé patch.hexdump:

00000aa: bbccdd 

Ensuite, en cours d'exécution xxd -r patch.hexdump my.binary modifiera le fichier my.binary pour modifier trois octets à l'offset 0xaa. Enfin, je dois également mentionner que dd peut rechercher dans un fichier binaire et lire/écrire un nombre donné d'octets, donc je suppose que vous pourriez utiliser le "script shell avec les commandes dd" comme format de patch.