HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Tetszőleges állomány tartalmának hexadecimális megjelenítése


Példaprogram letöltése

8170 bájt

Egészítsük ki a Windows Intézőjének gyorsmenüjét egy új menüponttal, mikor egy tetszőleges állományon kattintunk jobb egér gombbal. Mikor ezt a menüpontot választjuk, akkor induljon el egy alkalmazás, melyben a választott állomány tartalma jelenjen meg hexadecimális, illetve bináris formában.
Ezt felhasználva bármilyen állományba belenézhetünk gyorsan és könnyedén.

A mellékelt példa használatához a következő lépésekre van szükség: fordítsa le a programot, módosítsa a HexView.reg állományban található elérési útvonalat úgy, hogy az a lefordított HexView.exe-re mutasson, majd indítsa le a HexView.reg állományt, hogy a program regisztrációja megtörténjen. Ezt követően bármely állományon jobb egér gombbal kattint egy Intézőben, akkor megjelenik egy új menüpont Hex view... névvel. Ezt választva indítható el a mellékelt alkalmazás.
Nézzük miként működik az egész és kezdjük először az alkalmazás fejlesztésével.
Amikor a programunk indul, akkor feltételezzük, hogy paraméterként már megkapja a betöltendő állomány nevét, valami ilyen formában:
HexView.exe c:\mappa\file.txt
Erről a paraméterezésről majd az Intéző fog gondoskodni, ha megkérjük rá.
    public Form1()
    {
      InitializeComponent();
      try
      {
Most annyi a dolgunk, hogy ezt az első paramétert kiolvassuk és tároljuk a Form fejlécén.
        Text=Environment.GetCommandLineArgs()[1];
Következő lépésben meg is nyitjuk ezt az állományt olvasásra úgy, hogy közben engedélyezzük más alkalmazások hozzáférését is ahhoz.
        FileStream fs = new FileStream(Text, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
A típusától függetlenül nekünk most az állomány tartalmára van szükségünk, méghozzá bájtonként elérve azt. Ebben segít egy BinaryReader osztály, melynek konstruktorában az imént létrehozott FileStream-et adjuk meg, ami alapján tudja majd kezelni a már megnyitott állományt.
        BinaryReader br = new BinaryReader(fs);
        ...
Most jöhet egy ciklus, mely végigmegy az állomány összes bájtján. Egy több MB-os állomány esetén ez a megoldás igen lassú eredményt hozna, így ha ilyen méretű állományokat is kezelnénk, akkor módosítani kell a programot, hogy ne egyszerre olvasson be mindent, hanem csak részenként.
        for (i=0; i<fs.Length; i++)
        {
A BinaryReader osztály ReadByte függvényét meghívva beolvassuk a soron következő bájtot.
          b = br.ReadByte();
Mivel kétféle megjelenést kell biztosítanunk, ezért először e bájtnak az értékét hexadecimálissá alakítjuk és tároljuk átmenetileg egy sztringbe.
          s1 += b.ToString("X2") + " ";
A második esetben binárisan jelenítjük meg, melyet egy-egy karakter formájában helyezünk egy másik sztringbe. Itt tárolás előtt figyelnünk kell arra az esetre, ha a bájt értéke nulla. Mivel a nulla karakter lezárná a sztringünket, így ez hibás megjelenítéshez vezetne. Ezért a nulla karakter helyett egy pont karaktert fogunk megjeleníteni.
          if (b==0) b=(byte)'.';
          s2 += ((char)b).ToString();
A megjelenítést 16 bájtonként új sorba folytatjuk. Ha ennyi bájt összegyűlt a két átmeneti sztringünkbe, akkor ezeket megjelenítjük a ListBox következő sorába.
          if (c>=15)
          {
            s0 = (i-31).ToString("000000 ");
            listBox1.Items.Add(s0 + s1 + s2);
            s1 = "";
            s2 = "";
            c = 0;
          }
          else
          {
            c++;
          }
        }
A ciklus végeztével még előfordulhat, hogy van olyan nem megjelenített adat, mely még az állományhoz tartozik, de nem érte el a bájtok száma a 16-ot és így a ciklusmagon belül nem történt meg a megjelenítés, így ezt utólag meg kell tennünk.
        if (s1!="")
        {
          s0 = (i-31).ToString("000000 ");
          listBox1.Items.Add(s0 + s1 + s2);
        }
Végül már csak zárjuk az állományt és készen is vagyunk.
        br.Close();
        fs.Close();
      }
      catch
      {
      }
    }
Hátra van még az Intéző rábeszélése arra, hogy legyen egy új menüpont a gyorsmenüjében, ami elindítja a mi alkalmazásunkat, ráadásul úgy, hogy paraméterként átadásra kerül a választott állomány elérési útvonala, neve is.
Ennek eléréséhez csupán a Windows regisztrációs adatbázisába kell néhány bejegyzést tennünk, az alábbi módon:


[HKEY_CLASSES_ROOT\*\shell\HexView]
@="Hex view..."
[HKEY_CLASSES_ROOT\*\shell\HexView\Command]
@="F:\\So\\Cso\\0228\\HexView\\HexView.exe \"%1\""
A megadott programunk után írt %1 helyére kerül automatikusan behelyettesítésre az állomány elérési útja és neve. A %1-et ne felejtsük el idézőjelek közé tenni, különben hibásan működhet a programunk olyan esetben, ha egy-egy mappanévbe szóköz is kerül.
Például a C:\Program Files\abc.txt idézőjel nélkül két paramétert eredményezne az alkalmazásunk GetCommandLineArgs függvényének hívásakor, mivel ez a függvény a szóköz mentén bontja fel a paramétereket, így az első paraméter ez esetben a C:\Program lenne, ami ugye nem igazán egy megnyitható állomány.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 442. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |