| |

Allgemeine DiskussionenRe: Hexadezimale Darstellung von Zahlen | |  | Autor: Wöllmi | Datum: 12.06.04 11:14 |
| Hi Thoro,
also Du mußt Dir das mal von den Basics an vor Augen führen.
Hexadezimalzahlen, die in Dezimalzahlen umgewandelt werden
sollen, sind entsprechend des "Zieldatentyps" evtl. 2 fach deutbar.
D.h. es gibt immer eine "Vorzeichenlose" und eine "Vorzeichebehaftete"
Betrachtungsweise. Programmierer, die von der Pieke auf das ABC,
evtl. schon unter Assembler gelernt haben, können Dir ein Lied davon
singen. "Hochsprachen" lassen einem dieses ABC schnell mal vergessen.
Beispiel:
&hFF = 255 ( Vorzeichenlos)
&hFF = -1 (Vorzeichenbehaftet)
Was ist passiert?
VB interpretiert diesen Wert als Byte. Ein Byte kann folgende
Wertebereiche umfassen:
0 ... 255 => &h00 .... &hFF (ohne Vorzeichen!)
-128 ... +127 => &h80 .... &h7F (mit Vorzeichen!) Entscheidend ist für den Zieldatentyp das höchstwertige Bit!
Diese Bit stellt das Vorzeichen dar!
1 = Minus 255 Dez = &hFF = (Binär) 1111 1111
0 = Plus 127 Dez = &h7F = (Binär) 0111 1111
Das heißt also generell Achtung!
Man muß vorher wissen, wie die Hexadezimalzahl zu interprtieren ist.
Je nach Umwandlung kann es zu "bösen" Überreaschungen führen.
Dies kann Dir ja nun nicht mehr passieren
Aber achte auch auf Wertebereichsverletzungen.
Bsp. &hFFFF sieht ja aus wie eine Zahl, die in Integer passen könnte,
doch wenn Du
CInt("&hFFFF") ausführen läßt, erhälst Du einen Fehler. Warum?
Ganz einfach: Ein Integer geht von -32768 ... + 32767
und "&hFFFF" ist vorzeichnlos betrachtet 65535 und da benötigst Du eine "Long"
korrekt wäre also:
CLng("&hFFFF") In VB ist die Sache also etwas kompliziert, da es hier im Grunde genommen keine Vorzeichenosen Datentypen gibt.
INT, LONG, Single, Double => alles Vorzeichenbehaftete Datentypen.
Ausnahme "Byte" wird von 0..255 interpretiert.
Und noch toller wird es, wenn Du die Hexadezimalzahlen nicht entsprechend des Datentyps vollständig ausformulierst.
D.h.
15 Dezimal => paßt in Integer => &hF => &h000F
kann aber auch als Long abgebildet werden &h0000000F
oder in Byte &h0F.
Je nach Castoperator erhälst Du also unterschiedliche Dezimalergebnisse.
Merke: Wisse immer welcher Datentyp in der Quelle verborgen ist!
Du mußt Dich selber bemühen, daß ein korrektes Ergebnis rauskommt!
Hier ein Beispiel für die korrekte Umwandlung einer Hexadezimal in Dezimal
für den Wertebereich "Integer"!
Function fkt_iHex2Int(sData As String) As Integer
'
'Umwandlung eines Hexadezimalwertes "0000" bis "FFFF"
'in einen Integer-Dezimalwert unter Berücksichtigung
'des zulässingen Wertebereichs von -32768 bis + 32767
'
Dim lngDezimalZahl As Long
'Ein Integer kann hexadezimal max. 4 Stellen umfassen!
'Da &hFFFF vorzeichenlos 65535 ergibt muß mit
'"CLng" umgeformt werden!
lngDezimalZahl = CLng("&h" & Right$("0000" & sData, 4))
Select Case lngDezimalZahl
Case Is > 32767
'größter zulässiger INT-Wert von 32767
'wurde überschritten!
'Korrektur erforderlich!
lngDezimalZahl = lngDezimalZahl - 65536
End Select
fkt_iHex3Int = CInt(lngDezimalZahl)
End Function Für Long mußt Du natürlich gemäß des Wertevorrates genauso verfahren.
Ich hoffe es hat Dir ein wenig die Augen geöffnet und zeigt mal wieder,
daß auch ein noch so mächtiges Werkzeug (VB6) einem nicht jede
Denkarbeit abnehmen kann.
Merke: Ein Computer ist auch nur ein Mensch!
Tschaui
Woellmi  |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
Neu! sevDTA 3.0 Pro 
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR...
Jetzt nur 979,00 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|