2011-12-30 29 views
9

Mam 3 pliki binarne. Nazwijmy je: file1.bin, file2.bin i file3.bin.Diff dla 3 plików binarnych

  • file1.bin i file2.bin mają niektóre części wspólne.
  • file2.bin i file3.bin mają niektóre wspólne części.

Chcę znaleźć części wspólnych między file1.bin i file2.bin które różnią się między file2.bin i file3.bin.

Jak to zrobić, aby to osiągnąć? Już porzuciłem pliki binarne do plików tekstowych przy użyciu xxd, a następnie zrobiłem trójdrożną różnicę przy użyciu vim -d file1.txt file2.txt file3.txt.

Jednak vim oznacza część zmienioną we wszystkich plikach, nawet jeśli zmieniła się tylko w jednym pliku i pozostaje taka sama w pozostałych dwóch plikach. Chcę, aby te specjalne rodzaje zdarzeń były oznaczone inaczej.

Odpowiedz

6

Być może można użyć wbudowanego unixa diff (myślę, że jest częścią OSX), ale użyj --unchanged-group-format, aby wyświetlić listę podobieństw. Zrób to dla pliku 1 i pliku 2. Następnie zrób to dla pliku 2 i pliku 3. Następnie możesz wykonać zwykłą różnicę na dwóch wynikowych plikach.

Aby dowiedzieć się, jak uzyskać podobieństwa, spójrz na this post.

-1

Chromium używa bsdiff, a następnie przerzuciło się na cukinię do robienia różnic binarnych, jak wyjaśniono na ich blogu here. Możesz znaleźć przydatne kontakty ze swojego bloga.

+0

Czy można to zrobić w 3 sposób w sposób opisany w problemie? Nie mogę się dowiedzieć, jak to opisać? – Dimme

+0

bsdiff działa na plikach binarnych i tworzy łatę binarną. vimdiff oczekuje na pliki tekstowe jako dane wejściowe, więc nie mogę wymyślić sposobu, aby bsdiff działał tak, jak byś chciał. Alternatywnie, zobacz, czy możesz użyć opcji '' 'diffexpr''' do przekonwertowania vima, aby użyć dodatkowych ustawień dla programu diff podczas generowania brył dla plików binarnych - może użyj opcji '' -I'' do '' diff'' określa wyrażenie regularne dla "linii", które powinno być zignorowane, gdy robisz diff. – holygeek

0

Narzędzie, nad którym pracuję (ECMerge), wykonuje to. Trzeba tylko rozróżnić 3 pliki binarne, będzie pokazywać równe części przed sobą i zmodyfikować bajty odpowiednio umieszczone pomiędzy. Nie ma potrzeby, aby najpierw uzyskać zrzut heksadecymalny. Możesz napisać skrypt w JavaScript, aby wyprowadzić cokolwiek chcesz na podstawie wyników porównania i bajtów w plikach (działa również w linii poleceń).

Powiązane problemy