Strumento di diff binario per file molto grandi?

Ho bisogno di un’utilità per diffare due file binari. I file sono grandi (6-50 GB).

Nota: deve essere specificatamente indicato qui: la maggior parte dei programmi diff lavora mappando il file nel loro spazio di indirizzamento virtuale. Su Windows a 32 bit, questo limita le dimensioni dei file che possono essere confrontati con meno di 1 GB ciascuno. (1,5 GB se Windows viene eseguito con l’opzione / 3GB e il programma ha annunciato che è 3 GB a conoscenza; / LARGEADDRESSAWARE). Se un programma insiste sulla tecnica di mappare il file interamente nel suo spazio indirizzo, allora deve essere ricompilato come un’applicazione a 64 bit, che ha uno spazio di indirizzamento di 8 TB (che soddisfa i miei requisiti)

Beyond Compare è il mio strumento diff preferito, e lo posseggo, ma non può gestire file binari su ciò che può adattarsi allo spazio degli indirizzi del processo.

HexDiff 3.0 sembrava interessante, tranne la versione di prova non fa diff.

Stai cercando HxD, il miglior e gratuito Hex-Editor per Windows, nessuna modifica necessaria dal 3 aprile 2009, in quanto è priva di errori, semplicemente perfetta.

Il suo “Confronta file (semplice)” ( Ctrl + K ) lo rende visivo per qualsiasi file binario.

  • Apertura immediata indipendentemente dalla dimensione del file (fino a 8EB) 8 ExaByte sono 8 milioni di TeraByte.

((bsdiff è massicciamente elite :), a parte questo)

Personalmente mi piace vbindiff (modalità SUA) per i file di piccole dimensioni e ho testato beta questo blocco di strumenti (Windows WPF, client gratuito, costo per il feed di rete), che può eseguire una sottosezione molto rapida che si adatta a spazi di ricerca di contenuti grandi, dovrebbe essere rilasciato presto.

Se esegui file eseguibili (nativi), PatchDiff2 (lo strumento è gratuito, IDA è $) è un plug-in IDA che ti consente di ottenere una precisione superiore al 90-95%, anche con variazioni nell’ottimizzazione o altre impostazioni di creazione.

BinNavi , ($) è un altro strumento che funziona abbastanza bene.

Se vuoi qualificare la similarità dei binari, STAN (funziona in modalità SUA), può tagliare rapidamente la proverbiale BS per ottenere una scommessa sicura.

Solo per completezza, in relazione a bsdiff è il nuovo algoritmo di Google per il loro browser Chrome, Courgette sembra aver migliorato bsdiff di una discreta quantità, sarà bello vedere come può essere adattato ad altri formati, sembra sfruttare un ottimizzazione della ricerca della tabella dei simboli e ciò che sembra essere (non aver letto il codice) un miglioramento ottenuto utilizzando i puntatori basati (cioè non utilizzando gli indirizzi lineari, ma semplicemente usando l’offset nel modo più compatibile ansible con una notazione).

Il modo tradizionale per farlo è con “cmp -verbose” (equivalentemente, “cmp -l”). Aggiungi il flag “–print-bytes” (o “-b”) per rendere i diversi byte in un formato leggibile (in aggiunta ai valori decimali e ai numeri di byte forniti dal flag “–verbose”). Dato che i tuoi file sono così grandi, probabilmente vorrai inserire l’output in un file in modo da poterlo guardare e avere comunque i risultati da analizzare a tuo piacimento. Ad esempio, confronterò due file MP3 simili:

$ cmp --verbose --print-bytes a.mp3 b.mp3 | tee differences 16315 302 MB 115 M 16316 233 M-^[ 144 d 16317 110 H 224 M-^T 

. . . .

 21601545 377 M-^? 300 [email protected] 21601546 203 M-^C 0 ^@ 21601547 300 [email protected] 0 ^@ 

(Cita i nomi dei file in modo appropriato, ovviamente cmp capisce il flag “-” se ne hai bisogno. Puoi scrivere “cmp -lb” invece di usare gli argomenti lunghi.) Usa wc per vedere quanti byte differiscono:

 $ wc --lines differences 66115 differences $ wc --bytes a.mp3 b.mp3 21602502 a.mp3 21602502 b.mp3 43205004 total 

cmp confronta solo i file byte per byte (non può risincronizzare se i byte sono inseriti o cancellati), ma sembra essere esattamente ciò di cui hai bisogno. Può gestire file di dimensioni arbitrarie (e non richiede più memoria rispetto ai file di piccole dimensioni). Si trova di default su Mac OS X, i vari BSD e Unix, e GNU / Linux-ie, ogni sistema operativo moderno ampiamente utilizzato ad eccezione di Windows. (Si consideri un’installazione Cygwin minima o equivalente se questo è veramente un vincolo.)

Anche se questo sembra essere lo strumento giusto per il lavoro, è escluso da due dei tuoi criteri: è “basato su console” e non ha componenti grafici. Penso che ci debba essere qualcosa che manca nella descrizione del tuo problema. Puoi spiegare perché una console sarebbe problematica e quali dati aggiuntivi hai bisogno di visualizzare?

Puoi provare xdelta . Non ho mai cercato una versione GUI, ma puoi provare questo (anche se sembra essere solo KDE).

Sto usando WinMerge abbastanza felicemente per mostrare le differenze nei file binari. È anche un open-source gratuito.

Altrimenti, i tuoi file sono molto grandi e potrebbero non adattarsi a uno strumento diff – hai pensato di generare una patch binaria (ad esempio .ppf, Playstation Patch File) e dare un’occhiata?

Lavoro per ECMerge , se cerchi uno strumento di differenziazione e non un “delta”, cioè capire la differenza è più importante che avere una rappresentazione compatta, fa quello che vuoi. Non c’è praticamente alcun limite alle dimensioni del file (circa il centinaio rispetto ai byte di tera), solo sul conteggio delle differenze per evitare differenze patologiche (ad es. Miliardi di differenze).

I tuoi ultimi tre requisiti rendono questo un problema difficile. Cosa sarebbe un programma grafico di Windows che offriva che un programma di console basato su testo non potesse? Quindi non ci sono molti strumenti che fanno ciò che vuoi. Quindi ignorerò gli ultimi tre, prendo il mio karma nelle mie mani e suggerisco rdiff. È basato su testo e su console. Ma può diffare file binari di dimensioni arbitrarie. È ansible ottenere rdiff per Windows tramite Cygwin ( http://cygwin.com ).

Mi sono imbattuto in questo aspetto per uno strumento di confronto di file binari ricorsivo migliore di quelli che già utilizzo.

Ne conosco uno che potrebbe essere in grado di soddisfare le tue esigenze. L’unico modo in cui avrebbe esito negativo sarebbe nelle dimensioni del file, ma vale la pena provare. Si chiama Windiff e viene fornito con diverse versioni di strumenti di Windows / pacchetti di espansione / qualunque siano chiamati. Ho trovato che funziona abbastanza bene.

potresti provare vbindiff, http://www.cjmweb.net/vbindiff/

è un’app per console, tuttavia è molto ben fatta quindi la considero grafica – otterrai una schermata divisa che mostra i due file affiancati in esadecimale.

è progettato per gestire file di grandi dimensioni, sto guardando 2 file da 2 GB in questo momento.

Puoi provare hexdiff se compila su windows. È basato su console, ma ha un output grafico e ho visto diff tra due file da 5 GB senza problemi

Questo è un altro consiglio per HxD http://mh-nexus.de/en/hxd/ – L’ho appena usato per diff due file MXF da 3 GB per validare dove si verificava il danneggiamento del rendering di un frame. L’operazione ha richiesto circa 10 secondi, mentre Araxis Merge (il mio tradizionale e molto amato strumento diff) è riuscito a consumare tutta la memoria sulla macchina e ancora non ha funzionato per questa operazione.

Dato che i file sono così grandi e probabilmente ci sono più di alcune differenze, il diff sarà troppo grande per adattarsi a qualsiasi applicazione Windows standard possa essere eseguita. Quindi il mio approccio sarebbe:

  • Converti i file in testo. Utilizzare un dumper hex da riga di comando o, molto più utile, scrivere un piccolo programma che capisca cosa significhi il dato binario, in modo da poter confrontare dati significativi invece di sprechi di bit.

  • Utilizzare uno strumento diff della riga di comando (come quello di cygwin ). Gli strumenti della riga di comando GNU possono elaborare file di dimensioni arbitrarie.

  • Controlla il risultato con less . Potresti sostenere che vorrai vedere tutte le differenze, ma a meno che tu non sia un alieno in forma umana, il tuo cervello non può nemmeno tenere il contenuto di uno schermo intero pieno di testo nella sua memoria di lavoro. Quindi, se vuoi veramente ottenere qualcosa, devi ridurre la quantità di dati che hai a occhio.