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

7387 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 el 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, valamilyen hasonló formában:
HexView.exe c:\mappa\file.txt
Erről a paraméterezésről majd az Intéző gondoskodik, ha megkérjük rá.
  Public Sub New()
    MyBase.New()
    InitializeComponent()
    Try
Most annyi a dolgunk, hogy ezt az első paramétert kiolvassuk és tároljuk a Form fejlécén.
      Me.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 számára is a hozzáférését.
      Dim fs As New FileStream(Me.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.
      Dim br As 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.
      Dim i As Integer
      For i = 0 To fs.Length - 1
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 átmenetileg egy sztringbe tároljuk.
        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 pontkaraktert jelenítünk meg.
        If b = 0 Then
          b = CByte(".")
        End If
        s2 += ChrW(b).ToString()
A megjelenítést 16 bájtonként új sorban 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 Then
          s0 = (i - 31).ToString("000000 ")
          listBox1.Items.Add((s0 + s1 + s2))
          s1 = ""
          s2 = ""
          c = 0
        Else
          c += 1
        End If
      Next i
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 <> "" Then
        s0 = (i - 31).ToString("000000 ")
        listBox1.Items.Add((s0 + s1 + s2))
      End If
Végül már csak zárjuk az állományt és készen is vagyunk.
      br.Close()
      fs.Close()
    Catch
    End Try
  End Sub
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]
@="D:\\So\\Bso\\0112\\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.

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 |