2011-12-30 16 views
9

Ho 3 file binari. Chiamiamoli file1.bin, file2.bin e file3.bin.Diff per 3 file binari

  • file1.bin e file2.bin hanno alcune parti comuni.
  • file2.bin e file3.bin hanno alcune parti comuni.

voglio trovare le parti comuni tra file1.bin e file2.bin che sono diversi tra file2.bin e file3.bin.

Come si consiglia di farlo? Ho già scaricato i file binari in file di testo usando xxd e poi ho fatto un diff di 3 vie usando vim -d file1.txt file2.txt file3.txt.

Tuttavia, vim contrassegna una parte come modificata in tutti i file, anche se è stata modificata solo in un file e rimane la stessa negli altri due file. Voglio che quei tipi speciali di eventi siano contrassegnati in modo diverso.

risposta

6

Forse è possibile utilizzare il built-in unix diff (penso che sia parte di OSX), ma usare lo --unchanged-group-format per elencare le somiglianze. Fatelo per file1 e file 2. Quindi fatelo per file2 e file3. È quindi possibile eseguire un diff regolare sui due file risultanti.

Per un'idea di come ottenere le somiglianze, dare un'occhiata a this post.

-1

Chromium utilizza bsdiff, quindi passa a courgette per fare il diff binario come spiegato nel loro blog here. Potresti trovare utili suggerimenti dal loro blog.

+0

Può fare diff 3 vie nel modo in cui ho descritto nel problema? Non riesco a scoprire come, potresti descriverlo? – Dimme

+0

bsdiff funziona su file binari e produce patch binarie. vimdiff si aspetta che i file di testo vengano inseriti come input, quindi non riesco a pensare a un modo per far funzionare bsdiff come vorresti qui. In alternativa, vedi se puoi usare l'opzione '' 'diffexpr'' per convincere vim ad usare impostazioni extra per il programma diff quando generi hunk per i file binari - forse usa l'opzione '' -I'' a '' diff'' per specificare un'espressione regolare per "linee" che dovrebbero essere ignorate quando si fa il diff. – holygeek

0

Lo strumento per cui lavoro (ECMerge) lo fa. Devi solo diff 3 file binari, presenterà le parti uguali uno di fronte all'altro e modificati byte opportunamente collocato in mezzo. Non è necessario prima ottenere una discarica esadecimale. È possibile eseguire script in JavaScript per generare tutto ciò che si desidera in base ai risultati diff e ai byte nei file (funziona anche in riga di comando).