Artykuł

gru 26 2008
0

Porównywanie plików w Advanced Compare - tutorial

Jakiś czas temu, w jednym z artykułów na tej stronie, opisywałem sposoby operacji na plikach i pamięci. Jedną z metod, która została tam opisana, była tzw. edycja save'ów. Powyższy sposób polega na porównywaniu kilku plików i śledzeniu zmieniających się wartości. Ponieważ ta metoda często była wykorzystywana do porównywania zapisanych stanów gry, dlatego użyłem takiej, a nie innej nazwy. W dzisiejszym artykule, na podstawie aplikacji Advanced Compare (możecie ją znaleźć w dziale download), chciałbym przyjrzeć się bliżej tej niezwykle interesującej metodzie.

Generowanie danych testowych

Aby zacząć zabawę z programem Advanced Compare potrzebujemy jakiś danych testowych. Ponieważ pliki ze zapisanymi stanami gier są z reguły dość duże i mogłyby powodować zbyt dużo problemów jak na pierwszy raz, dlatego posłużymy się danymi specjalnie spreparowanymi do testów. W tym celu napiszemy małą aplikację w Javie, która będzie generować 9 plików o losowej zawartości. Jedna z wartości w każdym tym pliku, będzie modyfikowana w stały sposób (w każdym kolejnym pliku będzie rosnąć o jeden). Osoby nie zainteresowane programowaniem zapraszam od razu do akapitu Uruchamianie aplikacji TestFilesGenerator.

Tworzenie aplikacji TestFilesGenerator

Kod źródłowy całej aplikacji TestFilesGenerator można znaleźć w dziale kody źródłowe.

Aplikacja TestFilesGenerator, jest naprawdę mały prostym programem. Cały kod (pozbawiony komentarz) został przedstawiony poniżej:

import java.io.*;
public class TestFilesGenerator
{
    private static FileOutputStream oFileOutputStream;
    public static void main(String args[])
    {
        try
        {
            for(int i=1;i<10;i++)
            {
                oFileOutputStream = new FileOutputStream("plik"+i+ ".dat");
                for(int j=0;j<50;j++)
                {
                    oFileOutputStream.write((int)(Math.random()*10));
                }
                oFileOutputStream.write(i);
                for(int j=0;j<49;j++)
                {
                    oFileOutputStream.write((int)(Math.random()*10));
                }
                oFileOutputStream.close();
            }
        }
        catch (IOException ex)
        {
            System.err.println("Aplikacja wygenerowała następujący błąd: " +ex);
        }
    }
}

Interpretacja powyższego kodu jest niezwykle prosta. Kluczowe operacje wykonywane są w bloku try...catch. Wewnątrz pierwszej pętli for tworzymy 9 plików binarnych o nazwie plikX.dat (gdzie X to kolejny numer pliku). W dwóch wewnętrznych pętlach for generujemy 99 liczb losowych z zakresu 0-9. Polecenie, które znajduje się w linii 16 pomiędzy dwoma pętlami, służy do zapisu jednej ustalonej cyfry. W każdym pliku jest to cyfra o 1 większa. Dzięki temu mamy 100% pewność, że przynajmniej jedna wartość w pliku będzie zmieniała się według określonego trendu.

Kod przedstawiony powyżej musimy zapisać w pliku TestFilesGenerator.java. Możemy to zrobić choćby w najzwyklejszym systemowym Notatniku (przy zapisie należy pamiętać o zaznaczeniu opcji wszystkie pliki). W kolejnym kroku musimy skompilować kod (kompilacja wymaga zainstalowanego w systemie środowiska JDK). Uruchamiamy konsolę systemową i wpisujemy polecenie:

javac TestFilesGenerator.java

W ten sposób utworzymy plik zawierający klasę naszej aplikacji. Poleceniem:

java TestFilesGenerator

Uruchamiamy aplikację i tym samym generujemy 9 plików testowych. Możemy już przejść do kolejnego akapitu.

Uruchamianie aplikacji TestFilesGenerator

Pobieramy z działu download aplikację TestFilesGenerator. Po pobraniu, otwieramy konsolę systemową i w katalogu gdzie znajduję się nasz pobrany plik, wydajemy polecenie:

java -jar TestFilesGenerator.jar

Uzyskujemy w ten sposób 9 plików testowych, które wykorzystamy w dalszej części artykułu

Praca z edytorem heksadecymalnym

Ponieważ porównywanie plików nie jest do końca prostym zagadnieniem, dlatego zanim przystąpimy do pracy z programem Advanced Compare, musimy zrozumieć sposób działania tej aplikacji. Advanced Compare porównuje pliki w sposób binarny. W wyniku działania tej aplikacji otrzymujemy adresy komórek, które ulegały zmianie. Adresy domyślnie wyświetlane są w postaci szesnastkowej (jeśli przy wywoływaniu aplikacji skorzystamy z modyfikatora /OD, to zostaną one wyświetlone w postaci dziesiętnej). Wielu z użytkowników zada sobie pewnie pytanie po co kolejny system liczbowy i po co w ogóle mieszać. System szesnastkowy posiada jednak wiele zalet. Przede wszystkim istnieje duża ilość narzędzi, która pozwala na odczyt plików w trybie szesnastkowym i łatwą edycję wartości. Jedną z takich aplikacji jest darmowy edytor Notepad++ wzbogacony o dodatek Hex-Editor.

Interfejs Notepad++ jest prosty i intuicyjny. Aby uruchomić Hex-Editora klikamy na ikonkę H (patrz screen 1), która powinna znajdować się na pasku narzędzi w prawej jego części. Możemy przetestować jego działanie uruchamiając jeden z 9 plików wykonanych za pomocą naszej aplikacji. Na screenie 2 umieściłem widok szesnastkowy na przykładowy plik (plik1.dat). Niebieskim prostokątem oznaczyłem wartość, która jest kontrolowana przez nas. W tym przypadku wynosi ona 01, ponieważ jest to pierwszy z wygenerowanych plików. Powyższa wartość zawsze znajduje się w komórce o adresie numer 00000032. A czym tak właściwie jest ten adres? Adresem nazywamy miejsce, w którym przechowywana jest określona wartość w pliku. Adres definiowany jest za pomocą systemu szesnastkowego. W 1 kolumnie edytora widzimy kolejne grupy adresów: 00000000, 00000010, 00000020 itd. Uszczegółowienie adresu znajduje się w kolumnach od 0 do F (kolejne liczby systemu szenastkowego). Dlatego przykładowo w wierszu drugim możemy uzyskać adresy: 00000010, 00000011, 00000012 ... aż do 0000001F. W każdej komórce adresowej znajduję się wartość zapisana szesnastkowo (maksimum wynosi 255 czyli FF). Nasza aplikacja generowała liczby losowe od 0-9, dlatego też wszystko wygląda dość normalnie.

Jeśli chcemy zmodyfikować jakąś wartość możemy tego dokonać na dwa sposoby:

  • edytując wartość pod wskazanym adresem. W miejsce starej wartości wprowadzamy nową w postaci szesnastkowej.
  • wpisując wartość w kolumnie dump. Możemy tutaj umieścić dowolną wartość: tekst, znaki, cyfry itp. Patrz screen 3.

Oczywiście Notepad++ nie jest jedyną aplikacją pozwalającą na podglądanie plików w trybie szesnastkowym. Możemy równie dobrze skorzystać z dowolnej innej aplikacji np. Hex Workshop.

Porównywanie plików w Advanced Compare

Czas przejść do esencji tego artykułu, czyli do opisu programu Advanced Compare. Jak już wcześniej wspomniałem, aplikację można pobrać z działu download na naszej stronie. Po pobraniu i rozpakowaniu archiwum otrzymamy dwa pliki:

  • AC.exe - plik wykonywalny aplikacji
  • AC.doc - plik zawierający krótki opis aplikacji i sposób jej użycia

Ponieważ w pliku AC.doc, znajdziemy wiele teoretycznych informacji na temat AC, w tym akapicie postaram się przedstawić praktyczne podejście. Aby przystąpić do pracy z programem najlepiej jest, umieścić go w jednym folderze razem z plikami, które chcemy porównać. Ponieważ aplikacja jest bardzo mała, łatwo ją skopiować.

W kolejnym kroku musimy uruchomić konsolę systemową. Aby to uczynić wchodzimy do menu Start, wybieramy opcję Uruchom, gdzie następnie wpisujemy polecenie:

cmd

Możemy teraz przetestować działanie aplikacji wywołując polecenie:

ac

Nie otrzymamy jednak żadnych wymiernych korzyści po wykonaniu tego polecenia. Naszym oczom ukaże się jedynie lista dostępnych parametrów (patrz screen 4). Dużo ciekawsze efekty uzyskamy gdy jako parametry aplikacji podamy interesujące nas pliki:

ac plik1.dat plik2.dat plik3.dat plik4.dat plik5.dat plik6.dat plik7.dat plik8.dat plik9.dat

Na naszym ekranie pojawi się całkiem imponująca lista (patrz screen 5). Jest to wykaz wszystkich różnic. Ponieważ plik jest w pełni losowy (nie ma technicznej możliwości by pod jakimkolwiek adresem, w każdym pliku znalazła się ta sama wartość), dlatego też wartość number of differences jest równa 100. Dokładnie tyle ile wynosi wartość każdego pliku. Prześledźmy dla przykładu adres zawierający naszą sztucznie zmienianą liczbę, czyli adres 32h (literka h oznacza skrót od heksadecymalny):

32h 1 2 3 4 5 6 7 8 9

Każdy wiersz wynikowy budowany jest w ten sam sposób. Najpierw podawany jest adres komórki (w tym przypadku 32h), kolejno wartości dla poszczególnych plików (w tym przypadku 1,2,3...8,9). Jak widać na załączonym przykładzie, proces generowania plików zakończył się pełnym sukcesem:).

Powyższy przykład pokazuje jakie możliwości posiada Advanced Compare. Jednak największą jej esencją jest możliwość wyszukiwania, której zmieniają się w określonym trendzie. Jeśli do poprzedniej komendy, na końcu dopiszemy znak -, uzyskamy tylko adresy, których wartości w kolejnych plikach maleją. Jeśli użyjemy znaku +, uzyskamy sytuację odwrotną, wartości w kolejnych plikach muszą rosnąć. Spróbujmy zatem kolejnego polecenia:

ac plik1.dat plik2.dat plik3.dat plik4.dat plik5.dat plik6.dat plik7.dat plik8.dat plik9.dat +

W tym przypadku rezultat będzie już dużo bardziej zadowalający w stosunku do polecenia poprzedniego (patrz screen 6). Znaleźliśmy nasz specjalnie spreparowany adres! Jak widać przez Advanced Compare nic się nie ukryje:). Jeśli będziecie testować program, szybko przekonacie się, że z reguły wystarczy znacznie mniej plików (w tym wypadku potrzeba przeważnie 6 plików). Pewną wadą AC jest możliwość porównywania tylko 9 plików. W specyficznych przypadkach taka liczba może nie wystarczyć. W takim przypadku, można próbować dokonywać korekty wybranych adresów metodą prób i błędów. Oczywiście należy zawsze wykonać kopię zapasową edytowanych plików. Szczególnie jeśli mają one dla nas duże znaczenie.

Podsumowanie

W artykule przedstawiłem najważniejszą funkcjonalność programu Advanced Compare. Posiada on jednak dość dużą liczbę parametrów (głównie są to parametry związane z systemami liczbowymi), których wyjaśnienie można znaleźć w dołączonej, krótkiej instrukcji. Zachęcam do własnych eksperymentów z aplikacją.

Data ostatniej modyfikacji: 04.03.2011, 20:26.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus