dla programistów
Eclipse i Java
program
do obliczania sum
kontrolnych
Marek Sawerwain
hcąc napisać aplikację praw- na kodem zródłowym interfejsu użyt-
dziwie przenośną, nie mamy kownika, np. gdy zmienimy tekst
dużego wyboru. Obecnie wyświetlany przez etykietę w kodzie
Cnajbardziej dojrzałą platfor- zródłowym, to ta zmiana nastąpi rów-
mą, właściwą dla tego typu projektu, nież w edytorze wizualnym.
jest Java. Zapewnia ona pożądaną W tym artykule chciałbym przedsta-
przez nas cechę, czyli uruchamianie wić środowisko Eclipse, ale aby nasza
jednego kodu binarnego na różnych prezentacja nie była tylko teoretyczna,
platformach sprzętowo-programowych. napiszemy nieskomplikowaną aplika-
Jedynym konkurencyjnym rozwiąza- cję do obliczania wartości hash dla
niem o podobnych możliwościach jest danych tekstowych i plików, czyli gra-
Mono, ale nie jest to produkt tak doj- ficzny odpowiednik programu z konsoli
rzały, jak Java, rozwijana już od ponad o nazwie Md5sum.
dziesięciu lat.
Od dłuższego czasu możemy korzy- Instalacja środowiska
stać z darmowego środowiska dewe- Eclipse
loperskiego dla Javy o nazwie Eclipse, Pakiet Eclipse nie jest jeszcze dostępny
którego najnowsza wersja 3.0 została w popularnych dystrybucjach Linuksa.
wydana 25 czerwca 2004 roku. Możliwo- Trzeba samodzielnie ściągnąć odpo-
ści tego pakietu, napisanego oczywiście wiednie pakiety ze strony domowej pro-
w Javie, są niemałe. Najważniejszym ich jektu (oczywiście, na płytach CD/DVD
elementem jest modularna architektura, znajdujÄ… siÄ™ wszystkie potrzebne pliki
pozwalająca dodawać nowe funkcje do instalacyjne). Obecnie ostatnia stabilna
środowiska za pomocą wtyczek (ang. wersja jest oznaczona numerem 3.0.
plugins). Najlepiej ściągnąć pakiet Eclipse SDK.
Po zainstalowaniu i uruchomieniu Zawiera on dokumentację oraz przykła-
pakietu Eclipse może on wydawać dy, ale nie ma w nim maszyny wirtualnej
się kolejnym darmowym edytorem języka Java. Musimy zaopatrzyć się w nią
Na płycie CD/DVD
do kodu zródłowego, choć o sporych ściągając odpowiedni pakiet ze strony
Na płycie CD/DVD znajduje się
możliwościach: podświetlanie składni, Suna. Najlepszą wersją będzie Java SDK,
Eclipse i Java, kod zródłowy
podpowiedzi w kodzie czy dodatkowe chociaż wersja JRE jest wystarczająca,
tworzonego programu oraz
okno z drzewem wszystkich metod i pól gdyż Eclipse posiada własny kompilator.
wszystkie listingi z artykułu.
klas, nad którymi aktualnie pracujemy. W momencie pisania tego tekstu stabilna
O autorze
Możemy poczuć się nieco rozczarowani. wersja Javy nosi numer 1.4.2_05 i właśnie
Autor zajmuje siÄ™ tworzeniem
Siła Eclipse wyraża się jednak dostęp- najlepiej jej używać.
oprogramowania dla WIN32
nymi wtyczkami, gdyż po ich zainsta- W przypadku Linuksa istnieją dwie
i Linuksa. Zainteresowania: teoria
lowaniu otrzymujemy bardzo wygodne odmiany Eclipse: dla biblioteki Motif
języków programowania oraz
narzędzie RAD, w którym interfejs użyt- (ewentualnie Lesstif ) oraz dla biblioteki
dobra literatura. Kontakt z auto-
rem: autorzy@lpmagazine.org kownika budujemy za pomocą myszki. GTK+ 2. W tym artykule będziemy opie-
Oczywiście, nadal mamy pełną kontrolę rać się na tej drugiej.
68
pazdziernik 2004
dla programistów
Eclipse i Java
Po ściągnięciu pliku w formacie ZIP identyczna z głównym pakietem. Jeśli
Instalacja Javy
musimy go rozpakować. Będzie nam pakiet główny Eclipse został rozpakowa-
Pakiet instalacyjny Javy, dostarczany
w tym celu potrzebny program Unzip. ny w katalogu /opt, to instalacja VE prze-
przez Suna, występuje w dwóch wer-
Pobrany pakiet możemy rozpakować do biega przykładowo w taki sposób:
sjach: jako pakiet RPM i pakiet BIN.
dowolnego katalogu, np.:
InstalacjÄ™ dowolnej wersji jak zwykle
cd /opt
wykonujemy z konta root.
Instalacja pakietu RPM sprowadza mkdir /opt ; cd /opt unzip emf-sdo-runtime-2.0.0.zip
siÄ™ do wydania polecenia:
unzip eclipse-SDK-3.0-linux-gtk.zip unzip GEF-runtime-3.0.zip
unzip VE-runtime-1.0M2.zip
S
rpm -iv j2sdk-1_4_2_
-
Po rozpakowaniu zostanie utworzony
linux-i586.rpm
katalog eclipse, a w nim znajdziemy Po uruchomieniu środowiska Eclipse,
gotowe środowisko pracy. Program uru- wtyczka VE będzie już dostępna i gotowa
gdzie zapis oznacza nu-
chamiamy poprzez wydanie polecenia do pracy.
mer rewizji. Obecnie dostępna jest
eclipse. Oczywiście, w systemie musi
rewizja o numerze 05 i tÄ™ najlepiej zain-
być zainstalowana Java. Jak to zrobić oraz Plan programu
stalować, chyba, że dostępna będzie
wersja o wyższej rewizji. Jednak, co kilka przydatnych rad zawiera ramka Po instalacji środowiska i dodatkowych
może dziwić, pakiet RPM i tak pier- Instalacja Javy. wtyczek poświęcimy chwilę, aby zapla-
wotnie otrzymujemy w postaci pakietu
Środowisko Eclipse w podstawowej nować nasze dalsze działania. Ogólny
binarnego. Po jego ściągnięciu jeste-
wersji nie oferuje graficznego edyto- schemat naszego programu do wyzna-
śmy zmuszeni wykonać dwie dodatko-
ra interfejsu. Aby z niego skorzystać, czania odcisków prezentuje Rysunek 1.
we czynności. Należy nadać mu prawo
musimy ściągnąć odpowiednie wtyczki. W naszym programie istnieją tylko cztery
wykonywania:
Można to zrobić na dwa sposoby. główne zdarzenia: wybór pliku, wyzna-
Jeśli mamy dostęp do Internetu, czenie wartości odcisku, wyczyszczenie
S
chmod a+x j2sdk-1_4_2_-
wystarczy skorzystać z funkcji aktuali- pól edycyjnych oraz zakończenie pracy
linux-i586-rpm.bin
zacji Eclipse poprzez Sieć. Wybieramy programu. Obliczenie wartości odcisku
a następnie uruchomić:
z menu Help/Software Updates opcję jest uzależnione od wyboru użytkowni-
Find and Install. Po krótkiej chwili (pro- ka, gdyż można nakazać obliczyć odcisk
S
./j2sdk-1_4_2_-linux-
gram szuka nowych plików) wybieramy algorytmem MD5 bądz SHA1. Ponadto,
i586-rpm.bin
pakiet o nazwie VE, czyli Visual Editor obliczenia mogą zostać przeprowadzone
(ewentualnie VEP Visual Editor Pro-
Po zakończeniu działania otrzymamy go-
ject). Gdy powstawał ten tekst, wersja
towy do instalacji pakiet RPM. Czym sÄ… odciski
stabilna była dość stara, ale można
Drugi sposób instalacji, czyli insta-
(wartości hash)?
skorzystać z tzw. stabilnego strumie-
lacja z pakietu binarnego, jest przezna-
Stosuje się kilka określeń dla tego typu
czona dla bardziej zaawansowanych nia wersji pakietu VE, np. o numerze
wartości. Mówimy o odciskach plików,
użytkowników. Podobnie jak poprzednio,
1.0M2. Wersja ta, choć ma prawo spra-
wartościach hash, ale także o warto-
musimy nadać prawo wykonywania
wiać kłopoty, jest znacznie bogatsza
ściach funkcji skrótu bądz o sumie, np.
pliku:
w możliwości.
suma MD5. Istnieje szereg algorytmów
Alternatywą jest samodzielne zain- do wyznaczania odcisków. Algorytmy te
S
chmod a+x j2sdk-1_4_2_-
reprezentujÄ… tzw. funkcje jednokierun-
stalowanie odpowiednich pakietów.
linux-i586.bin
kowe (ang. one-way functions), gdyż
Pakiet VE występuje tylko w jednej wersji
na podstawie otrzymanej wartości nie
wspólnej dla platform Win32 i Linux.
Plik uruchamiamy i odpowiadamy na
można odtworzyć danych, z których
Istnieje również pakiet SDK, ale jest on
kilka pytań. Jednym z nich będzie pyta-
został wygenerowany odcisk. Odcisk
nie o katalog docelowy podajemy np. tylko istotny dla osób, które chciałyby
jest prawie niepowtarzalny. Wystar-
/opt. W katalogu docelowym zostanie
rozszerzyć możliwości VE. Do edytora
czy zmienić jeden bajt danych, aby
utworzony podkatalog o nazwie zależ-
dostępne są również przykłady, które
otrzymać inną wartość skrótu. Istnieje
nej od wersji, którą instalujemy. Gdy
szczerze polecam poczÄ…tkujÄ…cym adep-
pewne prawdopodobieństwo (zniko-
będzie to wersja 1.4.2_05, to katalog
tom Javy. Jeśli nie są nam potrzebne
me, ale jednak), że dla dwóch różnych
ten będzie nosił nazwę: j2sdk1.4.2_05.
przykłady, to interesuje nas tylko pakiet
zestawów danych otrzymamy iden-
Tak zainstalowana Java nie jest dla
Visual Editor Runtime. tyczne wartości hash. Mimo tej uwagi,
nas zbyt przydatna, ponieważ za
Pakiet VE wymaga do poprawne- algorytmy tego typu znakomicie nadajÄ…
każdym razem należy podawać pełną
się do weryfikacji, czy plik, ściągnięty
go działania dwóch innych wtyczek
ścieżkę do plików java, javac oraz
przez nas z Internetu, jest poprawny.
o nazwach EMF Build oraz GEF Build
pozostałych. Rozwiązaniem jest dopi-
Najpopularniejszymi algorytmami sÄ…
3.0. Na płytach CD/DVD znajdują się
sanie dodatkowej ścieżkę do zmiennej
użyte w artykule MD5 i SHA1, ale ist-
PATH. Najlepiej zrobić to w pliku /etc/ wszystkie potrzebne archiwa. Ich insta-
nieje wiele innych. Dobrym przykładem
bashrc:
lacja jest bardzo prosta. Podobnie jak w
jest popularny klient sieci P2P eDonkey.
przypadku Eclipse, wystarczy je rozpako-
Osiołek używa modyfikacji algorytmu
export PATH=$PATH:/opt/j2skd1.4.2_05/bin
wać programem Unzip. Wszystkie archi-
MD4 (starsza odmiana aktualnie stoso-
wa zawierajÄ… pliki w katalogu eclipse, co
wanego MD5).
oznacza, że ich struktura katalogowa jest
69
www.lpmagazine.org
dla programistów
że pozwala szybko zbudować interfejs
START stosowanie menedżerów wyglądu
wymaga czasem wzajemnego osadza-
nia elementów interfejsu, co oznacza
konieczność dokładniejszego jego
Wybór pliku
zaplanowania. Mówiąc krótko, trzeba się
dane tekstowe
zastanowić nad tym, co chcemy otrzy-
Obliczenie
wartości hash
mać. Podstawową wadą usunięcia mene-
dane z pliku
dżera wyglądu jest fakt, że komponenty
przy zmianie wymiaru okna nie będą się
Czyść
samoczynnie centrować.
T
Czyżÿobliczyć Obliczenia
wartość hash MD5? MD5 Na Rysunku 4 widać dwa okna.
Koniec
Oprócz podstawowego okna naszej
T aplikacji, będziemy również stosować
STOP
okno wyboru pliku. Dodanie tego
T
Czy obliczyć Obliczenia
wartość hash SHA1? SHA1
okna wymaga dopisania definicji nowej
zmiennej na początku ciała klasy:
S
private javax.swing.JPanel jContentPane
= null;
Rysunek 1. Schemat programu
Wpisanie tej linijki kodu spowoduje, że
dla danych tekstowych bądz dla danych trzy główne systemy GUI: AWT, Swing Eclipse, oprócz projektowanego przez
z pliku. Jak widać, struktura programu oraz SWT. Pod względem wydajności nas okna, będzie wyświetlał także okno
nie jest skomplikowana. Po tej krótkiej najlepszy jest SWT, ale my skorzysta- wyboru pliku. Nie jest to zbyt duża wada
chwili refleksji zaczynamy tworzyć nasz my ze Swing, który stał się standar- i można przyzwyczaić się do takiego
program. dem wśród aplikacji Javy. Tym samym, rozwiązania.
jako obiekt bazowy używamy ramki Pozostaje nam teraz ustawienie
Tworzenie projektu i klasy (Frame). Zwróćmy uwagę, że przy wszystkich komponentów na formatce.
głównej wybieraniu innych typów zmienia się Dodanie nowego komponentu powo-
Pracę nad programem rozpoczynamy wartość pola superclass. W naszej apli- duje generowanie nowej funkcji, której
od utworzenia projektu. Z menu File kacji w tym polu edycyjnym powinna zadaniem jest utworzenie kontrolki.
wybieramy pozycję New, a z listy, która znajdować się następująca wartość: Pamiętajmy o nazwaniu poszczególnych
się nam ukaże, opcję Project. Otrzymu- javax.swing.Frame. widgetów, przy czym nie ustalamy
jemy okno, w którym zebrano wszystkie własności name, ale field name. W ten
dostępne typy projektów. Nas interesuje Interfejs użytkownika sposób zmienne reprezentujące kompo-
Java Project. Po wybraniu projektu Po utworzeniu projektu i szkieletu nenty będą posiadały znaczące nazwy,
naciskamy przycisk Next. Ukaże się klasy rozpoczynamy tworzenie inter- co ma zasadnicze znaczenie nasz kod
nam okno podobne do tego z Rysun- fejsu. Korzystamy z kontrolek Swing, będzie czytelny dla każdego innego pro-
ku 2. Uzupełniamy tylko jedno pole, choć możemy wykorzystywać również gramisty.
oznaczone jako Project Name, w które AWT. System Swing, podobnie jak inne
wpisujemy nazwÄ™ naszego projektu, np. systemy GUI w Uniksach, dostarcza Poprawki w kodzie
HashCalc. specjalnych obiektów, dbających o interfejsu
Po utworzeniu projektu (wystar- równomierne rozłożenie komponentów. Gdy interfejs naszej aplikacji jest już
czy wcisnąć przycisk Finish) należy Jeśli z pewnych powodów nie lubimy zaprojektowany, to musimy jeszcze
utworzyć klasę główną, reprezentującą stosować menedżerów wyglądu i zależy wprowadzić małe poprawki, związa-
podstawowe okno naszej aplikacji. nam na samodzielnym zarzÄ…dzaniu ne z widgetem JComboBox. Wybieramy
Ponownie z menu File wybieramy opcję widgetami, to należy usunąć ten mecha- w nim, czy wartość odcisku ma być
New, lecz na liście, która się nam ukaże, nizm. Wybieramy widok projektowane- wyznaczona dla pliku, czy dla danych
wskazujemy Visual Class. Jeśli nie ma go okna, klikamy gdzieś na jego środku tekstowych. W kodzie zródłowym
takiej możliwości, oznacza to, że nie i przechodzimy do okna własności (ang. zmienna tego komponentu nosi nazwę
mamy zainstalowanej wtyczki VE. Po properties). Odszukujemy własność TypeComboBox. Pełen kod tej metody
wybraniu Visual Class zobaczymy okno Layout i z listy wyboru wybieramy war- jest bardzo krótki, a przedstawia
podobne do tego z Rysunku 3. Pierwszą tość null. go Listing 1. Względem oryginalnej
rzeczą, którą należy zrobić, to nazwać W ten sposób pozbyliśmy się mene- metody, wygenerowanej przez śro-
okno (pole Name). Klasę nazywamy dżera wyglądu. Teraz każdy komponent dowisko Eclipse, różni się ona tylko
tak jak projekt: HashCalc. Następnie przez nas położony możemy dowol- następującą linią kodu:
z listy Style wybieramy klasę bazową nie przemieszczać oraz zmieniać jego
naszego okna. Mamy do dyspozycji wymiary. Takie rozwiÄ…zanie ma tÄ™ zaletÄ™, TypeComboBox = new JComboBox(type_items);
70
pazdziernik 2004
dla programistów
Eclipse i Java
DataTextField.setText(""); int state;
MD5TextField.setText(""); state = getJfc().showOpenDialog(this);
S
SHA1TextField.setText(""); if (state == jFileChooser.
APPROVE_OPTION) {
S
Cała metoda tworząca przycisk CleanBtn DataTextField.setText(jFileChooser.
została przedstawiona na Listingu 2. Czy- getSelectedFile().getAbsolutePath());
telników, którzy po raz pierwszy widzą }
JavÄ™, zapewne dziwi deklaracja action-
Performed. Tworzymy w ten sposób Funkcja getJfc zwraca obiekt okna,
potrzebny obiekt i od razy przeciążamy więc mogliśmy wywołać metodę show-
odpowiednią metodę, choć lepiej powie- OpenDialog, a także tworzy okno, jeśli
dzieć, że definiujemy metodę anonimo- potrzeba. Gdy okno zostanie zamknię-
wą. te, to wartość wynikową metody show-
W przypadku przycisku Koniec OpenDialog umieszczamy w zmiennej.
(zmienna EndBtn) chcemy doprowadzić Następnie sprawdzamy, czy jest ona
do zakończenia pracy programu. Wystar- równa wartości jFileChooser.APPRO-
czy wywołać standardową metodę exit, VE_OPTION. Jeśli tak, to oznacza to, że
Rysunek 2. Tworzenie nowego projektu
co sprowadza się do jednej linii kodu użytkownik wskazał plik oraz zatwier-
umieszczonej w treści actionPerformed: dził ten fakt przyciskiem OK w oknie
Oryginalna metoda nie przekazuje żad- wyboru pliku. Pozostało nam tylko
nych danych w argumencie konstruk- System.exit(0); przenieść pełną ścieżkę wybranego
tora JComboBox. W naszej podaliśmy pliku do komponentu DataTextField.
tablicę elementów, którą ma zawierać Wybór pliku Zajmijmy się teraz funkcją getJfc.
nasz ComboBox. Definicję tej tablicy W naszej aplikacji posługujemy się Podczas budowy interfejsu każdy kom-
(podobnie jak okna wyboru plików) dodatkowym oknem, przeznaczonym do ponent położony na formatce powoduje
umieszczamy na początku ciała klasy wyboru pliku. Okno to zdefiniowaliśmy utworzenie funkcji z przedrostkiem get.
HashCalc: już wcześniej, dopisując odpowiednią Ponieważ samodzielnie zdefiniowaliśmy
deklarację na początku ciała klasy Hash- zmienną okna wyboru, to aby utrzymać
S
private String[] type_items={"dane Calc. tÄ™ samÄ… notacjÄ™, dla porzÄ…dku powinni-
tekstowe","dane z pliku"}; Wywołanie okna nastąpi po wybra- śmy utworzyć odpowiednią funkcję get.
niu przycisku z trzema kropkami, który Sposób działania tej funkcji jest nastę-
Przyciski znajduje się obok pola edycyjnego Data- pujący: jeśli wartość zmiennej jFileCho-
Czyść i Koniec TextField. Obsługa zdarzenia dla tego oser wynosi null, to należy utworzyć
Po trywialnych zmianach w kodzie przycisku to wywołanie innej metody o nowy obiekt; to dokładnie robi każda
interfejsu możemy przystąpić do nazwie SetFileName. Ta metoda nie jest z funkcji z przedrostkiem get. Pełną treść
implementacji zachowań naszych zbyt długa: funkcji getJfc zawiera Listing 3. Dodat-
przycisków. Na początek zajmijmy się
przyciskiem Czyść (w kodzie nosi on
nazwÄ™ CleanBtn). Zgodnie z naszymi
założeniami, ma on czyścić zawartość
trzech pól edycyjnych (pola danych
bądz nazwy pliku oraz dwóch pól,
w których są umieszczane wartości
hash).
Aby dodać nową obsługę zdarzenia,
wystarczy w oknie JavaBeans wskazać
potrzebny komponent i nacisnąć lewy
przycisk myszy. Pokaże się niewielkie
menu, w którym wybieramy podmenu
Events i z następnej listy opcję action-
Performed. Zostaniemy przeniesieni
do edytora, a kursor zostanie umiesz-
czony w treści wygenerowanej metody.
Powinna się tam znajdować jedna
linijka kodu, wyświetlająca komunikat
tekstowy. Ponieważ przycisk ma czyścić
pola edycyjne, to wystarczą następujące
trzy linijki wstawione zamiast oryginal-
Rysunek 3. Tworzenie klasy reprezentującej okno główne aplikacji
nej treści:
71
www.lpmagazine.org
dla programistów
obsługujący tę sytuację przedstawia się
następująco:
if(TypeComboBox.getSelectedIndex()==0) {
if(doMD5Calc) CalcMD5HashFromString();
if(doSHA1Calc) CalcSHA1HashFromString();
}
W drugim przypadku otrzymujemy
jedynkę. Tym razem będziemy wyzna-
czać wartość hash dla danych zawartych
w pliku. Zmienna DataTextField zawiera
pełną ścieżkę pliku, który został wybrany
przez użytkownika:
if(TypeComboBox.getSelectedIndex()==1) {
if(doMD5Calc) CalcMD5HashFromFile();
if(doSHA1Calc) CalcSHA1HashFromFile();
}
Wyznaczanie wartości
Rysunek 4. Projektowanie okna programu HashCalc
hash dla danych
tekstowych
kowo, wyłączamy możliwość zaznacze- własność zaprzeczenia. Jeśli od początku W zależności od wyboru użytkownika,
nia więcej niż jednego pliku. działania programu odpowiedni przy- wartość odcisku może zostać wyznaczo-
cisk wyboru jest zaznaczony, a zmienna na dla pliku bądz dla ciągu znaków.
Wybór algorytmów, posiada wartość logiczną true, to gdy Wywołujemy dwie różne funkcje dla tych
czyli przyciski wyboru użytkownik kliknie na przycisku, spo- przypadków. Zajmijmy się funkcją obli-
md5 i sha1 woduje jego odznaczenie i wykonanie czającą skrót MD5 dla ciągu tekstowe-
Nasz program pozwala na wybór algoryt- operacji zaprzeczenia zmianę wartości go. Jej nazwa to CalcMD5HashFromString,
mów, dla których ma zostać wyznaczona zmiennej z true na false. Dokładnie o to a treść znajduje się na Listingu 4.
wartość hash. Wybór algorytmu odbywa nam chodziło ponowne kliknięcie na Znajdujemy się w bardzo dobrej sytuacji,
się za pomocą widgetów checkbox. przycisku spowoduje jego zaznaczenie ponieważ nie musimy samodzielnie zajmo-
Implementację rozpoczynamy od dekla- i zmianę wartość logicznej z fałszu na wać się implementacją algorytmu MD5.
racji dwóch zmiennych: prawdę. Biblioteka standardowa Javy zawiera odpo-
Teraz możemy oprogramować obsłu- wiednie klasy. Na początek deklarujemy
private boolean doMD5Calc = true; gÄ™ przycisku Oblicz hash (zmienna o zmiennÄ… reprezentujÄ…cÄ… obiekt liczÄ…cy odcisk:
private boolean doSHA1Calc = true; nazwie HashCalcBtn). Na poczÄ…tek spraw-
dzamy, czy pole DataTextField zawiera MessageDigest md=null;
Wartością domyślną jest true, co ozna- jakieś dane:
cza, że po uruchomieniu programu W drugim kroku deklarujemy tablicę
S
wyznaczanie odcisku ma następować if(DataTextField.getText(). b, w której znajduje się ciąg tekstowy,
dla obydwu algorytmów (wartości tych compareTo("")==0) return; na podstawie którego wyznaczymy
zmiennych są sprawdzane w obsłudze odcisk. Wykorzystamy metodę getBy-
przycisku Oblicz hash). Z tego powodu Jeśli powyższy test powiedzie się, oznacza tes, która zmieni typ String na ciąg
zwracamy uwagę podczas projektowania to, że komponent DataTextField jest pusty bajów:
interfejsu, aby domyślnie obydwa przyci- i nie przeprowadzamy żadnych obliczeń.
ski wyboru (o nazwach MD5CheckBox oraz Następnie sprawdzamy, jaka wartość Listing 1. Metoda tworząca komponent
SHA1CheckBox) były zaznaczone. została wybrana w kontrolce TypeCombo- TypeComboBox
Użytkownik może dowolnie wybie- Box. Wykorzystujemy metodę getSelec-
private JComboBox getTypeComboBox() {
rać pomiędzy tymi dwoma algorytma- tedIndex. Wartości zwracane tą metodą
if (TypeComboBox == null)
mi. Aby to umożliwić, należy utworzyć odpowiadają dokładnie tablicy elemen-
S{
TypeComboBox = new
obsługę zdarzenia itemStateChanged dla tów, którą wcześniej zadeklarowaliśmy.
JcomboBox(type_items);
S
przycisków wyboru. Kod, który należy W pierwszym przypadku otrzymuje- TypeComboBox.setBounds(13,
56, 125, 21);
podać, to jedna linia programu, np. my zero. Jest to pierwszy element tablicy,
TypeComboBox.setSelectedIndex(0);
dla algorytmu MD5: doMD5Calc=!do- na którym znajduje się wartość dane
}
MD5Calc;. tekstowe. Wybranie tej wartości oznacza
return TypeComboBox;
Ponieważ zmienna doMD5Calc jest obliczanie wartości hash z ciągu znaków
}
typu logicznego, to wykorzystujemy tutaj podanych przez użytkownika. Kod
72
pazdziernik 2004
dla programistów
Eclipse i Java
algorytmem SHA. Pełny kod zródłowy ponieważ może się zdarzyć, że odczytamy
Listing 2. Metoda odpowiedzialna za
funkcji zawiera Listing 5. mniej danych niż wynosi wielkość bufora,
utworzenie przycisku CleanBtn
Na początku definiujemy kilka np. przy końcu pliku. Jest to bardzo istot-
private JButton getCleanBtn() {
dodatkowych zmiennych. Zmienna ne, ponieważ w wywołaniu sha1.update
if (CleanBtn == null) {
buff to bufor, w którym wczytujemy trzeba koniecznie podać dokładną ilość
CleanBtn = new Jbutton();
dane o wielkości 1024 bajtów. Jeśli informacji. Gdyby była ona większa, zmie-
CleanBtn.setText("Czyść");
S
chcemy ją zmienić, to należy pamiętać niłaby się wartość odcisku.
CleanBtn.addActionListener
(new java.awt.event.ActionListener() {
o zmiennej chunkSize, która przecho- Dane w pętli odczytujemy tak długo,
S
public void actionPerformed
wuje wielkość bufora. W następnej jak metoda read nie zwróci nam wartości
(java.awt.event.ActionEvent e) {
zmiennej (hash) będziemy przechowy- -1, co oznacza koniec pliku. Po opusz-
DataTextField.setText("");
wać wyznaczoną ostatecznie wartość czeniu pętli aktualną wartość odcisku
MD5TextField.setText("");
odcisku. Zamienimy ją pózniej na ciąg przenosimy do tablicy hash wywołaniem
SHA1TextField.setText("");
}
liczb szesnastkowych funkcją hexEn- metody digest(). Kończy ona cały proces
});
code. Ostatnia zmienna bytesRead to generowania odcisku. Pozostało nam już
}
liczba aktualnie odczytanych bajtów. tylko przenieść odcisk do pola edycyjnego.
return CleanBtn;
Za chwilę wyjaśnię, do czego będzie Jak widać, proces generowania wartości
}
nam potrzebna. skrótu, dzięki bogatej w możliwości
Identycznie jak przy danych tek- bibliotece standardowej Javy, nie jest zbyt
byte[] b=DataTextField.getText().getBytes(); stowych, tworzenie odcisku poprze- trudny.
dza utworzenie odpowiedniego obiektu:
Teraz tworzymy obiekt liczÄ…cy odcisk dla Funkcja hexEncode
S
algorytmu MD5 (jak widać z Listingu 4, MessageDigest sha1=MessageDigest. O ile Eclipse wspomaga nas w pracy
tworzenie obiektu znajduje siÄ™ w sekcji getInstance("SHA"); nad interfejsem, to zawsze pozostajÄ…
try): pewne elementy wymagające ręcz-
Kolejnym elementem jest otwarcie stru- nego zakodowania. Przykładem jest
md=MessageDigest.getInstance("MD5"); mienia danych. NazwÄ™ pliku odczytu- funkcja hexEncode oraz metoda main.
jemy z pola edycyjnego DataTextField. W pierwszej kolejności zajmiemy się
Sam proces liczenia odcisku jest bardzo Za pomocą pętli odczytujemy cały plik. tą pierwszą.
krótki i sprowadza się do wywołania Dla każdej odczytanej porcji danych uak- Pełną treść tej funkcji przedstawia
metody update, gdzie za argument tualniamy wartość odcisku za pomocą Listing 6. Deklarujemy trzy zmienne,
podajemy tablicę b: md.update(b);. Następ- sha1.update. przy czym dość istotna jest tabli-
nie przenosimy gotowy odcisk do kolejnej W jednej iteracji odczytujemy ilość ca digits, w której przechowujemy
tablicy: byte[] hash=md.digest();. danych równą wielkości bufora. Ilość poszczególne cyfry systemu szesnastko-
Nie możemy bezpośrednio sko- odczytanych informacji zapamiętujemy wego. Sam proces konwersji odbywa się
piować zawartości tablicy do pola w zmiennej bytesRead. To bardzo ważne, w pętli for.
MD5TextField, ponieważ w przypad-
ku odcisków zwykło podawać się je
w postaci szesnastkowej. Wykonujemy
takÄ… konwersjÄ™ za pomocÄ… funkcji hexEn-
code.
Nie będę przedstawiał funkcji
dla algorytmu SHA, ponieważ jest
bardzo podobna. Pierwsza różnica
polega na tym, że podczas tworzenia
obiektu wywołaniem MessageDigest.
getInstance w argumencie podaje-
my ciÄ…g SHA zamiast MD5. Druga
różnica dotyczy pola edycyjnego
zamiast w MD5TextField, dane
w postaci szesnastkowej umieszczamy
w polu edycyjnym SHA1TextField.
Wyznaczanie wartości
hash dla pliku
Analogicznie jak dla danych teksto-
wych, również dla pliku mamy dwie
funkcjÄ™ liczÄ…ce odciski dla obydwu
algorytmów. Tym razem dla odmiany
Rysunek 5. Obliczanie odcisku dla przykładowego pliku
opiszę wyznaczanie wartości hash
73
www.lpmagazine.org
dla programistów
Listing 3. Funkcja getJcf dla okna wybory plików
private javax.swing.JFileChooser getJfc() {
if (jFileChooser == null) {
jFileChooser = new javax.swing.JFileChooser();
jFileChooser.setMultiSelectionEnabled(false);
}
return jFileChooser;
}
W pierwszej linii kodu pętli odczy- nie nie były to bardzo skomplikowane
tujemy zawartość i-tego bajtu tablicy obliczenia.
inputBuf. Następnie do ciągu znaków
result dołączamy dwa znaki z tabli- Metoda main
cy digits. Technika adresowania W naszym programie już praktycznie
tablicy jest związana ze sposobem wszystko zostało zrobione. Mamy za- Rysunek 6. Eksport aplikacji do
zorganizowania bajtu w systemie dwój- projektowany interfejs oraz opro archiwum jar
kowym. Załóżmy, że odczytaliśmy gramowane wszystkie zdarzenia, ale
z tablicy wejściowej bajt o wartości po uruchomieniu program nic
255. Dwójkowo, ta liczba przedstawia się nie dzieje (nie wyświetla się żadne Polecenie to wydajemy w katalogu,
się następująco: 11111111, natomiast okno). Winę za to ponosi metoda main w którym znajdują się skompilowane
szesnastkowo będzie to FF. Cyfra F to naszej klasy. Środowisko Eclipse pliki class. Taki sposób nie jest jednak
inaczej szesnaście. Zwróćmy uwagę na wygenerowało pustą metodę main i to najlepszy. Lepiej, aby nasz program
to, że szesnaście w zapisie binarnym na nas spoczywa obowiązek dopi- znajdował się w postaci archiwum
to 1111. Naszym zadaniem jest wycią- sania odpowiedniego kodu. Zadanie jar. Pomoże nam w tym zadaniu samo
gnięcie dwóch liczb po cztery bity. funkcji main jest bardzo proste: środowisko Eclipse. Z menu File należy
Pierwsze cztery bity odczytamy poprzez należy utworzyć okno i wyświetlić wybrać opcję Export. W oknie, które
wykonanie operacji bitowego and je na ekranie. Sprowadza się to się nam ukaże, wybieramy z listy opcję
z wartością F0 (w systemie binarnym do dwóch linii kodu, a cała statyczna Jar Export. Ukaże się nam kolejne okno
będzie to 11110000). Następnie musimy metoda main prezentuje się następu- (Rysunek 6), w którym zaznaczamy,
przesunąć otrzymaną liczbę w prawo o jąco: że chcemy dokonać eksportu klasy
cztery bity, aby poznać rzeczywistą war- HashCalc. Następnie wskazujemy kata-
tość tych bitów. Warto to przedstawić na public static void main(String[] args) { log i nazwę pliku, w którym chcemy
przykładzie. Najpierw operacja bitowa: HashCalc hc_win=new HashCalc(); utworzyć gotowe archiwum jar. Nie
hc_win.show(); klikamy jeszcze na tym etapie przyci-
11111111 } sku Finish, gdyż za pomocą przycisku
and 11110000 Next, naciśniętego, co ważne, dwa razy,
-------- Tworzymy pakiet przechodzimy do ostatniego podokna.
11110000 w formacie jar Interesuje nas pole MainClass. Możemy
Uruchomienie naszego programu bezpośrednio wpisać, że klasą główną
a po przesunięciu w prawo o cztery wymaga podania następującego pole- jest HashCalc lub wybrać ją za pomocą
pozycje otrzymujemy: cenia: przycisku Browse.
Otrzymaliśmy w ten sposób tylko
00001111 java -cp . HashCalc jeden plik zamiast kilkunastu plików
Jest to pierwsza wartość w systemie
Listing 4. Funkcja obliczająca hash z ciągu znaków algorytmem MD5
szesnastkowym F. Do odczytania
private void CalcMD5HashFromString() {
drugiej czwórki bitów wystarczy ope-
MessageDigest md=null;
racja and z wartością 0F. Przesunięcie
byte[] b=DataTextField.getText().getBytes();
w prawo bądz w lewo nie jest już
try {
potrzebne:
md=MessageDigest.getInstance("MD5");
}
catch(NoSuchAlgorithmException e) {
11111111
System.out.println("Nie można utworzyć klasy obliczającej sumę MD5!!!");
and 00001111
}
--------
md.update(b);
00001111
byte[] hash=md.digest();
MD5TextField.setText(hexEncode(hash));
}
Jak widać, hexEncode wymaga operowa-
nia bezpośrednio na bitach, ale ostatecz-
74
pazdziernik 2004
dla programistów
Eclipse i Java
Listing 5. Wyznaczenie wartości hash dla pliku algorytmem SHA1
private void CalcSHA1HashFromFile(){
byte[] buff=new byte[1024];
byte[] hash = null;
int chunkSize=1024;
int bytesRead=0;
try {
MessageDigest sha1=MessageDigest.getInstance("SHA");
S
BufferedInputStream bis=new BufferedInputStream(new FileInputStream
(DataTextField.getText()));
while((bytesRead=bis.read(buff,0,chunkSize)) != -1) {
sha1.update(buff,0,bytesRead);
}
hash=sha1.digest();
}
catch(Exception e) {
e.printStackTrace();
}
SHA1TextField.setText(hexEncode(hash));
}
Listing 6. Funkcja hexEncode zamieniająca ciąg bajtów na ciąg szesnastkowy
private String hexEncode( byte[] inputBuf) {
StringBuffer result = new StringBuffer();
char[] digits = {'0', '1', '2', '3', '4','5','6','7','8','9','a','b','c','d','e','f'};
int i;
for (i = 0; i < inputBuf.length; ++i){
byte b = inputBuf[i];
result.append( digits[ (b & 0xf0) >> 4 ] );
result.append( digits[ b & 0x0f ] );
}
return result.toString();
}
class. Program uruchamiamy w następu- procesorze typu Celeron 1 GHz praca
jący sposób: ze środowiskiem jest raczej trudna,
szczególnie z wizualnym edytorem.
java -jar HashCalc.jar To jest charakterystyczne dla Javy, że
wymaga ona lepszego sprzętu, szcze-
Podsumowanie gólnie, aby zapewnić dostateczną
Eclipse to niewątpliwie bardzo przy- wydajność.
datne środowisko dla programistów Ogólnie, Eclipse to znakomity pro-
Javy, zarówno początkujących, jak jekt godny polecenia. Tym bardziej,
również zaawansowanych. Wizualny że oprócz Javy wspiera aplikacje
edytor GUI powoduje, że Eclipse może pisane w C/C++, a także inne języki
konkurować z komercyjnymi aplikacja- programowania, takie jak choćby
mi, choć brakuje mu dobrego wsparcia Cobol, co dobrze świadczy o tym pro-
dla baz danych. Można wierzyć, jekcie.
że dzięki rozszerzeniom pojawi się
w przyszłości odpowiedni zestaw kom-
W Internecie:
ponentów.
Nie ma jednak róży bez kolców.
" Strona domowa Eclipse:
Eclipse w wersji dla Linuksa w porów-
http://www.eclipse.org/
naniu do wersji na platformÄ™ Win32
" Spis rozszerzeń (wtyczek)
działa wolniej. Szczególnie, gdy dyspo- dla Eclipse:
nujemy 256 MB pamięci RAM. Komfor- http://www.eclipse.org/tools/
index.html
towe warunki pracy zapewni 512 MB
" Strona domowa Javy:
pamięci, a w przypadku większych
http://java.sun.com/
projektów warto pomyśleć o 1 GB. Nie
bez znaczenia jest też procesor. Przy
75
www.lpmagazine.org
Wyszukiwarka
Podobne podstrony:
Program do obliczania pól figur geometrycznych Polek 1 2 pl
Program kompuerowy do obliczeń wytrzymałościowych POMOC
DNAStat wersja 2 1 – program do obsługi bazy danych profili genetycznych oraz do obliczeń biostatyst
METODY POBIERANIA PRÓBEK DO CELÓW URZĘDOWEJ KONTROLI
dane do obliczen 1
tabele do obliczeń więźby dachowej
6 31 Wprowadzenie do ActiveX i projektowania kontrolek ActiveX (2)
Funkcja do obliczania szybkości korozji ekranów w kotle nadkrytycznym
K Książyński Tablice do obliczeń hydraulicznych
Wzory do obliczen stezen chlorkow i zasadowosci
2004 04 Grajek, czyli dekoder plików OGG [Programowanie]
3 Zastosowanie regresji liniowej do obliczania szybkości reakcji chemicznych
więcej podobnych podstron