Seite 1 von 1
Was genau tut dieser Code?
Verfasst: 30.03.2013 17:42
von mikes1
Liebe Purebasic-Profis,
ich komme mit der unten stehenden Syntax nicht so ganz klar, vielleicht könnt
ihr mir ja erklären, was genau dieser tut, es ging ursprünglich eigentlich mal um eine
Umrechnung einer Hex-Zahl, was aber nicht richtig funktioniert hat. Dadurch
wurde eine falsche Zahl für die ursprüngliche Hexzahl gespeichert und mich würde
nun interessieren, wie diese Umrechnung unten funktioniert und vielleicht auch wo
der Fehler liegt:
Code: Alles auswählen
For i = 1 To Len(a$)
d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6)
Next
Vielen Dank im voraus und Grüsse
mikes1
__________________________________________________
Code-Tags hinzugefügt
30.03.2013
RSBasic
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 19:24
von 7x7
Der Code funktioniert so wie er soll. Du musst nur die Variable 'd' wieder auf null setzen, wenn eine andere Hexzahl konvertiert werden soll
z.B:
Code: Alles auswählen
For a=0 To 255
a$=Hex(a)
;----------
d=0
For i = 1 To Len(a$)
d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6)
Next
Debug d
;----------
Next a
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 19:34
von Kevin
mikes1 hat geschrieben:Liebe Purebasic-Profis,
ich komme mit der unten stehenden Syntax nicht so ganz klar, vielleicht könnt
ihr mir ja erklären, was genau dieser tut, es ging ursprünglich eigentlich mal um eine
Umrechnung einer Hex-Zahl, was aber nicht richtig funktioniert hat. Dadurch
wurde eine falsche Zahl für die ursprüngliche Hexzahl gespeichert und mich würde
nun interessieren, wie diese Umrechnung unten funktioniert und vielleicht auch wo
der Fehler liegt:
Code: Alles auswählen
For i = 1 To Len(a$)
d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6)
Next
Vielen Dank im voraus und Grüsse
mikes1
Hi,
mit negativen zahlen hat es nicht funktioniert und du musst d immer auf 0 setzen
Code: Alles auswählen
Procedure ValHex(hex$)
Protected d=0,len,i,char,neg
If Left(hex$,1)="-"
hex$=Mid(hex$,2)
neg=1
Else
neg=0
EndIf
len=Len(hex$)
For i = 1 To len
char=Asc(UCase(Mid(hex$,i,1)))
d = (d << 4) + char-48 - 7 * (char>>6)
Next
If neg
ProcedureReturn -d
Else
ProcedureReturn d
EndIf
EndProcedure
Debug ValHex("fffffff")
Debug Val("$fffffff")
Debug ValHex("abcdef")
Debug Val("$abcdef")
Debug ValHex("-23450")
Debug Val("-$23450")
Debug ValHex("-1000")
Debug Val("-$1000")
Debug ValHex("-fffffff")
Debug Val("-$fffffff")
mfg
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 19:43
von 7x7
@Mikes1
Sorry, eigentlich wolltest du ja wissen, wie der Code FUNKTIONIERT.
"d<<4" multipliziert das bisherige Ergebnis mit 16 (bei mehrstelligen Hexzahlen)
"Asc(UCase(Mid(a$,i,1)))-48" ergibt als Ergebnis eine Zahl zwischen 0 bis 22 ("0"=ASCII 48, "F"=ASCII 70)
"-7* (Asc(UCase(Mid(a$,i,1)))>>6)" ergibt -7, wenn das Zeichen "A....F" war, ansonsten 0 bei den Zeichen "0...9"
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 20:05
von mikes1
Super vielen Dank an Euch - ja auch die Art der Umrechnung war wichtig für mich.
Vielen Dank nochmal !
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 20:14
von 7x7
Nebenbei bemerkt: Der Code ist von der Logik her nicht schlecht! Hab schon andere Sachen gesehen...
GELÖSCHT
Verfasst: 30.03.2013 20:22
von mirca
GELÖSCHT
Re: Was genau tut dieser Code?
Verfasst: 30.03.2013 20:45
von 7x7
mirca hat geschrieben:Ist es nicht sinnvoller
wenn man die Länge vorher in eine Variable
speichert und diese nach To einfügt?
Auch Mid() wird unnötig zweimal verwendet.
Hast natürlich Recht, aber selbst bei einer 4-stelligen Hexzahl sollte die CPU dabei nicht ins Schwitzen kommen
Und falls doch, kann man ja immer noch einfach die ganze Schleife durch d=Val("$"+a$) ersetzen
