Tipp 056: Umrechnung/Umwandlung Hexadezimal zu Dezimal und vice versa
Autor: Alexander Kopatz VB-Version: Visual Basic 6.0 Download: Beispielprojekt Tipp-056
Beschreibung
Dieses Code-Beispiel zeigt die Umrechnung von Zahlen des Dezimalsystems in jene das Hexadezimalsystems und umgekehrt. Beim Hexadezimalsystem handelt es sich um ein Stellenwertsystem zur Basis 16, wobei die Zahlen von 10 bis 15 durch die Buchstaben A bis F symbolisiert werden. Eine hexadezimale Darstellung von Daten kann insbesondere bei der Anzeige von Binärdaten bzw. Bit- und Bytewerten hilfreich sein. So lassen sich etwa die 8 Bit eines Bytes auch durch eine zweistellige Hexadezimalzahl übersichtlich darstellen:
Binär Hexadezimal Dezimal
1 = 1 = 1
10100001 = A1 = 161
10101010 = AA = 170
11111111 = FF = 255
1111101000 = 3E8 = 1000
Umrechnung Hexadezimal zu Dezimal
Die Wertigkeit jeder einzelnen Zahlenposition im Hexadezimalsystem ergibt sich als Potenz aus der Basis 16 und einem Exponenten in Form der Stelle der jeweiligen Ziffer beginnend bei Null. Diese Wertigkeit wird dann mit dem Zahlenwert der jeweiligen Stelle (von 1 bis F, sprich 1 bis 15) multipliziert und die Teilergebnis zu einer Gesamtsumme addiert. Für die Hexadezimalzahl F3A9 ergibt dies:
9 * 16^0 + A * 16^1 + 3 * 16^2 + F * 16^3 = 62377
9 * 16^0 + 10 * 16^1 + 3 * 16^2 + 15 * 16^3 = 62377
9 * 1 + 10 * 16 + 3 * 256 + 15 * 4096 = 62377
9 + 160 + 768 + 61440 = 62377
In Programmcode ausgedrückt ließe sich diese Rechenoperation schematisch z.B. wie folgt lösen:
For Zähler = 0 To (LängeHexZahl - 1)
HexWert = Mid(HexaZahl, LängeHexZahl - Zähler, 1)
Select Case HexWert
Case "A": HexWert = "10"
Case "B": HexWert = "11"
Case "C": HexWert = "12"
Case "D": HexWert = "13"
Case "E": HexWert = "14"
Case "F": HexWert = "15"
End Select
Dezimal = Dezimal + HexWert * (16 ^ Zähler)
Next
Umrechnung Dezimal zu Hexadezimal
Die Umrechnung von der Dezimal- in die Hexadezimalschreibweise funktioniert ebenfalls Schrittweise. Der gesamte Zahlenwert wird durch 16 dividiert, ein ggf. überbleibender Rest wird entsprechend notiert, bleibt kein Rest so wird eine 0 notiert. Sodann wird der sich ergebendes Wert des Quotienten wieder durch sechzehn geteilt und der Rest notiert und so fort. Das Vorgehen sei hier anhand der Zahl 9137 exemplarisch dargestellt:
9137 : 16 = 571 Rest: 1 [1]
571 : 16 = 35 Rest: 11 [B]
35 : 16 = 2 Rest: 3 [3]
2 : 16 = 0 Rest: 2 [2]
Das Ergebnis lautet folglich: 23B1
Zur Umsetzung dieses Vorgangs in Software ist die Modulo Funktion sehr hilfreich, da Sie den Rest einer Division direkt zur Verfügung stellt. Hierdurch lässt sich eine Umwandlung mit wenigen Zeilen Code erreichen. Exemplarisch dargestellt ergibt sich folgende Funktion:
Do
HexWert = Dezimal Mod 16
Select Case HexWert
Case 10: HexWert = "A"
Case 11: HexWert = "B"
Case 12: HexWert = "C"
Case 13: HexWert = "D"
Case 14: HexWert = "E"
Case 15: HexWert = "F"
End Select
Ergebnis = HexWert & Ergebnis
Dezimal = Dezimal \ 16
Loop Until Dezimal < 1
Visual Basic Hex-Funktion
Die oben gemachten Ausführungen dienen dem besseren Verständnis der verschiedenen Zahlensysteme und deren Verhältnis zueinander. Zudem soll gezeigt werden wie eine einfache und komfortable Umsetzung entsprechender Umrechnungsalgorithmen aussehen kann. Es sei jedoch ausdrücklich darauf hingewiesen, dass VB bereits von Hause aus mit einer eigenen Umrechnungsfunktion von Dezimal zu Hexadezimal aufwartet. Der Name der Funktion in der Visual Basic IDE lautet Hex, als Parameter akzeptiert die Funktion einen beliebigen dezimalen Zahlenwert.
Die Umgekehrte Rechnung beherrscht die Hex-Funktion überraschender Weise nicht. Hier ist jedoch weder Hopfen noch Malz verloren, da eine andere Funktion hilfreich einspringt. Mit Hilfe der Umwandlungsfunktion Change-Long (CLng) lässt sich auch eine Hexzahl in eine Dezimalzahl verwandeln. Falls noch nicht vorhanden ist es lediglich erforderlich der Funktion durch ein vorgestelltes '&H' einen Hexadezimalwert anzuküdigen.
Im Anschluss finden Sie ein Beispiel, welches die Umwandlung hexadezimal zu dezimal und umgekehrt demonstriert und dabei auch einige unzulässige Eingaben ausfiltert. Dabei werden sowohl die Visual Basic eigenen Funktionen vorgestellt als auch die individuellen Implementierungen gezeigt und vergleichen.
Zusatzinformationen
» Tipp 054: Umrechnung/Umwandlung Binär- bzw. Dualsystem zu Dezimal
Quellcode
frmKonverter
Form frmKonverter
Label lblDezimal
Label lblHex
TextBox txtDezimal
TextBox txtDezimal
TextBox txtHex
' VISUAL BASIC WORLD
' ===========================================
' Das große Portal zum Thema Visual Basic.
'
' Wenn Ihnen dieser Source Code gefallen hat,
' dann empfehlen Sie Visual Basic World bitte
' weiter und/oder setzen Sie einen Link auf:
'
' http://www.visualbasicworld.de/
'
' Vernetzen Sie sich mit uns:
'
' http://twitter.com/visualbasicwrld
Option Explicit
Private bolUserEingabe As Boolean
Private Sub txtHex_Change(Index As Integer)
If bolUserEingabe Then
bolUserEingabe = False
txtHex(Index Xor 1).Text = txtHex(Index).Text
If Not txtHex(Index).Text = "" Then
txtDezimal(0).Text = HexToDez(txtHex(Index).Text)
txtDezimal(1).Text = HexToDez2(txtHex(Index).Text)
Else
txtDezimal(0).Text = HexToDez(0)
txtDezimal(1).Text = HexToDez2(0)
End If
End If
End Sub
Private Sub txtHex_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 46 Then bolUserEingabe = True
End Sub
Private Sub txtHex_KeyPress(Index As Integer, KeyAscii As Integer)
Select Case KeyAscii
Case 127, 8
'ENTF-Taste
'Backspace-Taste
Case 48 To 57, 65 To 70, 97 To 102
'0 bis 9
'A - F
'a - f >> A - F
If KeyAscii > 70 Then KeyAscii = KeyAscii - 32
'Kleinbuchstaben in Großbuchstaben
'umwandeln.
Case Else
KeyAscii = 0
End Select
bolUserEingabe = True
End Sub
Private Sub txtDezimal_Change(Index As Integer)
'Dankenswerterweise bringt Visual Basic
'eine Hex-Umwandlungsfunktion direkt von Hause aus mit.
'Dies erleichtert die Implementierung erheblich.
If bolUserEingabe Then
bolUserEingabe = False
txtDezimal(Index Xor 1).Text = txtDezimal(Index).Text
If Not txtDezimal(Index).Text = "" Then
txtHex(0).Text = Hex$(txtDezimal(Index).Text)
txtHex(1).Text = DezToHex(txtDezimal(Index).Text)
Else
txtHex(0).Text = Hex$(0)
'VB-Funktion im Vergleich zur Visual Basic World
'Implementierung.
txtHex(1).Text = DezToHex(0)
End If
End If
End Sub
Private Sub txtDezimal_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 46 Then bolUserEingabe = True
End Sub
Private Sub txtDezimal_KeyPress(Index As Integer, KeyAscii As Integer)
Select Case KeyAscii
Case 127, 8
'ENTF-Taste
'Backspace-Taste
Case Else
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Select
bolUserEingabe = True
End Sub
modKonverter
' VISUAL BASIC WORLD
' ===========================================
' Das große Portal zum Thema Visual Basic.
'
' Wenn Ihnen dieser Source Code gefallen hat,
' dann empfehlen Sie Visual Basic World bitte
' weiter und/oder setzen Sie einen Link auf:
'
' http://www.visualbasicworld.de/
'
' Vernetzen Sie sich mit uns:
'
' http://twitter.com/visualbasicwrld
Option Explicit
Public Function HexToDez(ByVal strHex As String) As Long
'==========================================================='
'= Fkt. wandelt eine Hexadezimalzahl ins Dezimalsystem um. ='
'==========================================================='
HexToDez = CLng("&H" & strHex)
'Die eigentliche Hauptarbeit übernimmt für uns die
'Change-Long-Funktion. Diese berrerscht auch die
'Umwandlung einer Hexadezimalzahl in das Zehnersystem.
End Function
Public Function HexToDez2(ByVal strHex As String) As Long
'==========================================================='
'= Fkt. wandelt eine Hexadezimalzahl ins Dezimalsystem um. ='
'==========================================================='
'Die Funktion HexToDez2 erledigt die selbe Aufgabe wie
'HexToDez und dient lediglich der Veranschaulichung einer
'möglichen Umsatzung in Source Code.
Dim lngZähler As Long
Dim lngMax As Long
Dim strHexValue As String
lngMax = Len(strHex)
For lngZähler = 0 To (lngMax - 1)
strHexValue = Mid$(strHex, lngMax - (lngZähler), 1)
Select Case strHexValue
Case "A": strHexValue = "10"
Case "B": strHexValue = "11"
Case "C": strHexValue = "12"
Case "D": strHexValue = "13"
Case "E": strHexValue = "14"
Case "F": strHexValue = "15"
End Select
HexToDez2 = HexToDez2 + _
CDbl(strHexValue) * (16 ^ lngZähler)
Next
End Function
Public Function DezToHex(ByVal dblDezimal As Double) As String
'====================================================='
'= Fkt. rechnet eine Dezimalzahl in eine Hexzahl um. ='
'====================================================='
'Diese Funktion leistet das selbe wie die VB-Funktion Hex.
'In einer Produktivanwendung empfiehlt sich der jedoch aus
'Geschwindigkeitsgründen der Einsatz der Hex-Funktion.
Dim strHexValue As String
DezToHex = ""
Do
strHexValue = dblDezimal Mod 16
Select Case strHexValue
Case 10: strHexValue = "A"
Case 11: strHexValue = "B"
Case 12: strHexValue = "C"
Case 13: strHexValue = "D"
Case 14: strHexValue = "E"
Case 15: strHexValue = "F"
End Select
DezToHex = strHexValue & DezToHex
dblDezimal = dblDezimal \ 16
Loop Until dblDezimal < 1
End Function