Anmelden

View Full Version : Hexzahl in integer umwandeln



Kampi4
27-09-06, 15:35
Hallo allerseits,
ich bitte um euere Hilfe zu folgendem Thema:
Ich bekomme in VARPG eine Hexzahl. Zum Beispiel "51" oder "A3", etc.
Ich muss diese mit mit normalen Dezimalzahlen vergleichen. Gibt es eine RPG Funktion, die mir hinten die Dezimalzahl ausspuckt, wenn ich vorne die Hexzahl reinschmeisse?

Also HEX = 51 ---> Dezimal = 81 order HEX = A3 ---> Dezimal = 163

Schon mal danke für euro Hilfe!!

Mfg KAMPI

Fuerchau
27-09-06, 15:42
Naja, nicht direkt:

D DS
D BIN2 5I 0 inz
D CHAR 1 overlay(BIN2:2)

char = 'A';
if Bin2 = ....

Fuerchau
27-09-06, 15:47
Vertan vertan ;)

Wenn du die Zeichenwerte 'A3' hast und nicht den Hexwert, also X'A3', dann musst du die C-Funktion

int sscanf(const char *buffer, const char *format, argument-list);

verwenden.

Kampi4
28-09-06, 07:21
Danke erst mal für die Antworten. Werde das mal probieren.

Mfg KAMPI

Kampi4
28-09-06, 07:27
Zu deiner ersten Antwort noch mal:
Also der Wert steht in nem String, den ich über die Serielle Schnittstelle aus nem Tester auslese (alle Werte sind da dezimal, nur der eine nicht :mad: ), und da steht dann nicht nur z.B. "51" sonder "0x51". Ist das dann ne "richtige" Hex Zahl, bei der ich dein erstes Beispiel benutzen kann? Abgesehen davon verstehe ich das noch nicht ganz ... :o

Mfg KAMPI

Fuerchau
28-09-06, 07:57
Das 1. Beispiel ist hierfür korrekt.

Zur Erklärung:
5I 0 = 2-Byte-Binär als Ganzzahl, also X'0000' im Speicher.
Durch das Overlay auf Stelle 2 wird das Zeichen eben Rechtsbündig übertragen und kann dann als Zahl ausgewertet werden.

Zum Vergleich RPG:

I DS
I I B 1 20BIN2
I 2 2 XCHAR

MOVE FELD XCHAR
Z-ADD BIN2 ....
:

Kampi4
28-09-06, 08:51
Ah so, danke für die Erklärung.

Ich habe es in der zwischenzeit selber mit einer Routine gelöst.
Ich splitte meine Zahl (z.B. "51") erst mal auf in "5" und "1". Dann schaue ich nach, ob in den beiden Feldern "ABCDEF" vorkommt. Wenn ja würde ich halt den entsprechenden Dezimalwert reinschreiben.
Dann wird bei diesem Beispiel die "5" *16 genommen und mit der "1" addiert. Dann habe ich meinen Dezimalwert!
Funktioniert und hat nicht lange gedauert es zu programmieren. :)

Trotzdem noch mal danke für deine Hilfe.

Mfg KAMPI

Fuerchau
28-09-06, 11:51
Ganz schön kompliziert, da du ja erst noch von Hex expandieren musst, also aus X'51' eben '51'. Wie löst du das ?

Ansonsten zum Rechnen bietet sich auch eine Tabelle "0123...def' an in der man die Zeichen suchen läßt, der (Index-1) ergibt die Wertigkeit.

Naja, am einfachsten gehts jedoch tatsächlich mit C-Funktionen / MI-API's.

Kampi4
28-09-06, 13:09
Ich weiss, dass der mein Wert in dem großen String, den ich über den Com-Port bekomme, immer an einer bestimmten Stelle Anfängt und 5 Stellen lang ist. Die ersten beiden Stellen sind immer "0x". Dann kommt halt max. dreistellig der Hex-Wert. Also nehme ich mir mit nen Substring einfach die drei Stellen nach den "0x".

Mfg KAMPI