
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.
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.