|
Die Visual Basic-eigene Hex-Funktion
ist dazu gedacht, einzelne Zahlen als Strings im Hexadezimal-System
darzustellen. Längere Byte-Folgen, wie etwa Speicherauszüge
("Dumps") lassen sich damit jedoch kaum erstellen. Ebenso
wenig ist die Darstellung von Datei-Inhalten als so genannte "HexDumps",
wie sie von vielen Datei-Betrachtern und Hex-Editoren geboten
werden, damit direkt realisierbar. Schließlich fehlt auch noch die
Möglichkeit, ganze Zeichenfolgen (Strings) in ihrem hexadezimalen
Äquivalent darzustellen. Die hier vorgestellten Funktionen
StringToHexString, HexStringToString und HexDump füllen diese
Lücke (wegen des Umfangs siehe gesonderte Code-Seite!).
Das Grundgerüst bildet die Funktion StringToHexString, die im
einfachsten Fall die Zeichen eines ihr übergebenen, nahezu beliebig
langen Strings Byte für Byte in Hex-Darstellung umsetzt.
Public Enum HexStringConstants
hsANSI
hsUnicode
End Enum
Public Function StringToHexString(Text As String, _
Optional ByVal CharMode As HexStringConstants, _
Optional ByVal ReverseOrder As Boolean = True, _
Optional Delimiter As String, _
Optional GroupDelimiter As String, _
Optional ByVal CharsPerGroup As Long = 4) As String
Im optionalen Parameter CharMode können Sie festlegen, ob die
Rückgabe in herkömmlicher ANSI-Darstellung (zwei
Hexadezimal-Stellen je Zeichen bzw. Byte) oder in
Unicode-Darstellung (zwei Byte je Zeichen, somit vier
Hexadezimal-Stellen) erfolgen soll. Im weiteren optionalen Parameter
ReverseOrder (Voreinstellung = True, wirksam nur für
die Unicode-Darstellung) können Sie dazu festlegen, ob die
tatsächliche Reihenfolge der Bytes im Speicher dargestellt werden
soll (niederwertiges Byte zuerst), oder ob die lesefreundlichere
Darstellung als vierstellige Hexadezimalzahl erfolgen soll.
Über die weiteren optionalen Parameter können Sie den
Rückgabe-String gleich formatieren. Zum einen können Sie in
Delimiter einen String angeben, der zwischen die Darstellung der
einzelnen Zeichen eingefügt werden soll - etwa ein Leerzeichen. Zum
anderen können Sie einen GroupDelimiter angeben, der die Abfolge in
Gruppen zerteilt. Für eine zeilenweise Darstellung etwa können Sie
hier eine Zeilentrennung angeben (vbCrLf). Damit können Sie eine
Blockdarstellung für einen Hex-Betrachter formatieren. Der String "ABOUT
Visual Basic" beispielweise sieht in der einfachen
ANSI-Darstellung so aus:
41 42 4F 55 54 20 56 69
73 75 61 6C 20 42 61 73
69 63
Dazu die Unicode-Darstellung mit umgekehrter Reihung:
0041 0042 004F 0055 0054 0020 0056 0069
0073 0075 0061 006C 0020 0042 0061 0073
0069 0063
Die zweite Funktion HexStringToString bildet das Gegenstück
dazu. Sie verwandelt einen solchen Hexzahlen-Strom wieder in einen
lesbaren String zurück. Dabei entfernt sie auch vollständig die
Formatierung. Sie müssen ihr dazu natürlich die entsprechenden
Informationen wieder als Parameter übergeben.
Public Function HexStringToString(HexString As String, _
Optional ByVal CharMode As HexStringConstants, _
Optional ByVal ReverseOrder As Boolean = True, _
Optional Delimiter As String, _
Optional GroupDelimiter As String) As String
Die dritte Funktion HexDump liefert die hexadezimale Darstellung
eines Speicherbereichs, dessen Startadresse Sie in Form eines
Zeigers ("Pointers") und dessen Länge Sie als Anzahl der
auszulesenden Bytes übergeben. Sie setzt auf der ersten Funktion
StringToHexString auf und kopiert dazu den gewünschten
Speicherbereich in einen String. Dieser wird dann als Unicode-String
behandelt und die Ausgabe erfolgt in originaler Byte-Reihung. Auch
hier können Sie die Ausgabe gleich passend formatieren lassen.
Public Function HexDump(ByVal Ptr As Long, _
ByVal Bytes As Long, _
Optional Delimiter As String, _
Optional GroupDelimiter As String, _
Optional ByVal CharsPerGroup As Long = 4) As String
Die im Parameter Ptr geforderten Zeiger auf die Startadresse
erhalten Sie über die (nicht dokumentierten) Visual
Basic-Funktionen ObjPtr, zu verwenden bei Objekt-Variablen, und
VarPtr für alle übrigen Variablen. VarPtr verwenden Sie ebenfalls
für Benutzerdefinierte Variablen ("UDTs") und für
Arrays. Bei letzteren geben Sie den Zeiger auf das erste Element an,
ab dem der Speicherbereich ausgelesen werden soll.
Ein paar Beispiele:
Debug.Print HexDump(ObjPtr(ObjektVariable), 16)
Debug.Print HexDump(VarPtr(LongZahl), 4)
Debug.Print HexDump(VarPtr(UDT), LenB(UDT))
Debug.Print HexDump(VarPtr(EinByteArray(0), 256)
|