Visual Basic World - Programmierung und BeispieleVisual Basic World - Tipps und TutorialsVisual Basic World - Source-Code und Forum

<leer>

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

<leer> Aktuelle Seite Back To Top
Druckansicht | Feedback | Favoriten
Copyright © Visual Basic World, 2000-2022 | Kontakt | Impressum

Visual Basic World @ Twitter

Folgen Sie Visual Basic World!

Visual Basic World @ Twitter
Wenn Ihnen Visual Basic World gefällt, dann folgen Sie uns doch bei Twitter (@visualbasicwrld).
Vielen Dank!