Seite 1 von 2

ASCII-HEX String in Val umwandeln

Verfasst: 19.12.2005 09:17
von helitron
Hallo und guten Morgen zusammen,
versuche mich als alter C-Programmierer gerade das erste Mal mit PureBasic (das ich übrigens genial finde :-) ) und bin leider schon auf ein Problem aufgelaufen. Habe eine Prozedur geschrieben, die einfach nur einen zweistelligen HEX-Wert, dargestellt in ASCII, in ein Byte umwandeln soll, also z.B. "1D" in $1D. Jetzt habe ich das Problem, dass PB keine unsigned chars, also Bytes ohne Vorzeichen kann, und ich ab einem Wert von "80" nach der nachfolgenden Zurückwandlung in einen String mit Hex() nur mehr $FF von meiner Funktion zurückbekomme.

Hier mein Prozedurcode:

Code: Alles auswählen

;- Konvertiert den übergebenen 2-stelligen ASCII-HEX-Wert in eine Dezimalzahl 
Procedure.b ASCIIHexToVal(Input$)
Output.b = 0
For i = 1 To 2 
  Output.b << 4 
  Select Mid(Input$,i,1) 
    Case "0" 
    Case "1": Output.b + 1 
    Case "2": Output.b + 2 
    Case "3": Output.b + 3 
    Case "4": Output.b + 4 
    Case "5": Output.b + 5 
    Case "6": Output.b + 6 
    Case "7": Output.b + 7 
    Case "8": Output.b + 8 
    Case "9": Output.b + 9 
    Case "A": Output.b + 10 
    Case "B": Output.b + 11 
    Case "C": Output.b + 12 
    Case "D": Output.b + 13 
    Case "E": Output.b + 14 
    Case "F": Output.b + 15 
  EndSelect 
Next 
ProcedureReturn Output.b
EndProcedure
freedimension: Code-Tags gesetzt

Wäre dankbar für jeden Tipp !

Liebe Grüße,
Erwin

Verfasst: 19.12.2005 10:07
von ts-soft
Hab jetzt nicht ganz verstanden, aber ersetze mal die vorletzte Zeile mit:

Code: Alles auswählen

ProcedureReturn Output.b & $FF
Ich denke mal, das haste gemeint

Verfasst: 19.12.2005 10:59
von helitron
Hallo Thomas,

danke für den Tipp, aber jetzt steh ich irgendwie auf dem Schlauch :-), wenn ich ein Byte mit $FF mittels UND logisch verknüpfe, passiert mit dem ja eigentlich gar nichts oder ? Passiert ja nur dann was, wenn zumindest 1 Bit auf 0 steht oder ist das in PB anders ?

Gruss,
Erwin
ts-soft hat geschrieben:Hab jetzt nicht ganz verstanden, aber ersetze mal die vorletzte Zeile mit:

Code: Alles auswählen

ProcedureReturn Output.b & $FF
Ich denke mal, das haste gemeint

Verfasst: 19.12.2005 11:28
von ts-soft
& ist ein Bitweises AND
In der Hilfe findeste eine genauere Beschreibung.

StrU() sollteste vielleicht auch mal ansehen!

Ich denke mal mit PB4 wird auch ein UByte kommen, hoffe ich jedenfalls, dann wird vieles einfacher :wink:

Verfasst: 19.12.2005 11:59
von helitron
Hallo Thomas,

das mit dem bitweisen UND war mir schon klar, habe seit 25 Jahren damit zu tun (solange mach ich den Job mit Assembler + C schon :-) ). Nur ist es eben grade bei dem bitweisen UND so, dass nur Nuller-Bits in dem einen Byte im anderen etwas bewirken können (eben auf Null setzen). Das heißt, wenn ich ein BYTE mit $FF mit einem bitweisen UND verknüpfe, kann sich dran nichts ändern. Anders, wenn ich es mit einem Word mache, dann wird damit natürlich das obere Byte auf Null gesetzt.

Das StrU() wird wahrscheinlich mein Problem auch nicht lösen, da es meines Wissens nur Dezimalwerte wandeln kann, aber keine HEX-Werte.

Werde aber auf jeden Fall weiterprobieren :-) .......

Danke auf jeden Fall mal.

Tschüss,
Erwin

ts-soft hat geschrieben:& ist ein Bitweises AND
In der Hilfe findeste eine genauere Beschreibung.

StrU() sollteste vielleicht auch mal ansehen!

Ich denke mal mit PB4 wird auch ein UByte kommen, hoffe ich jedenfalls, dann wird vieles einfacher :wink:

Verfasst: 19.12.2005 13:43
von Falko
Sollte es so funktionieren?

Code: Alles auswählen

;- Konvertiert den übergebenen 2-stelligen ASCII-HEX-Wert in eine Dezimalzahl
Procedure.b ASCIIHexToVal(Input$)
Output.w = 0
For i = 1 To 2
  Output << 4
  Select Mid(Input$,i,1)
    Case "0"
    Case "1": Output + 1
    Case "2": Output + 2
    Case "3": Output + 3
    Case "4": Output + 4
    Case "5": Output + 5
    Case "6": Output + 6
    Case "7": Output + 7
    Case "8": Output + 8
    Case "9": Output + 9
    Case "A": Output + 10
    Case "B": Output + 11
    Case "C": Output + 12
    Case "D": Output + 13
    Case "E": Output + 14
    Case "F": Output + 15
  EndSelect
Next
ProcedureReturn Output
EndProcedure 
Debug ASCIIHEXToVal(Hex(254))

Verfasst: 19.12.2005 14:17
von helitron
Hallo Falko,

besten Dank, das sieht gut aus. Mit dem Word trickse ich das Sign-Bit im Byte aus, irgendwie hatte ich auch schon in diese Richtung gedacht. Bin nur vom C mit seinen unsigned Variablen etwas verwöhnt und dachte, dass es vielleicht irgendwie einfacher geht :-) .

Tschüss,
Erwin
Falko hat geschrieben:Sollte es so funktionieren?

Code: Alles auswählen

;- Konvertiert den übergebenen 2-stelligen ASCII-HEX-Wert in eine Dezimalzahl
Procedure.b ASCIIHexToVal(Input$)
Output.w = 0
For i = 1 To 2
  Output << 4
  Select Mid(Input$,i,1)
    Case "0"
    Case "1": Output + 1
    Case "2": Output + 2
    Case "3": Output + 3
    Case "4": Output + 4
    Case "5": Output + 5
    Case "6": Output + 6
    Case "7": Output + 7
    Case "8": Output + 8
    Case "9": Output + 9
    Case "A": Output + 10
    Case "B": Output + 11
    Case "C": Output + 12
    Case "D": Output + 13
    Case "E": Output + 14
    Case "F": Output + 15
  EndSelect
Next
ProcedureReturn Output
EndProcedure 
Debug ASCIIHEXToVal(Hex(254))

Verfasst: 19.12.2005 16:54
von Kaeru Gaman
deswegen der hinweis von Thomas: mit &$FF wird das vorzeichenbit "überlistet"

Verfasst: 19.12.2005 17:14
von helitron
Hallo zusammen,

ist jetzt schon klar, nur hat Thomas leider bei der ersten Antwort mein Output.b belassen, das heißt ein Byte und bei einem Byte hat das &$FF natürlich keine Wirkung, erst bei einem Word. Falko hat's ja dann auf den Punkt gebracht, die Outputvariable muss ein Word sein, wobei man dann ja ganz ohne &$FF auskommt, weil Output.w am Beginn der Procedure auf Null gestellt wird.

Meine Procedure läuft nun einwandfrei, danke nochmal für die Hilfe.

Inzwischen hat sich eine weitere offene Frage bei mir bezüglich PB ergeben, betrifft aber ganz was anderes und da werde ich einen eigenen Thead aufmachen.

Tschüss,
Erwin
Kaeru Gaman hat geschrieben:deswegen der hinweis von Thomas: mit &$FF wird das vorzeichenbit "überlistet"

Verfasst: 19.12.2005 17:16
von ts-soft
>> Thomas leider bei der ersten Antwort mein Output.b belassen
Macht doch nichts, hätteste Dir mal das Ergebnis angesehen :wink:

Procedure gibt immer ein Long zurück. Angehängte Variablentypen haben nur auf Strings und Floats eine Auswirkung (sind in Wirklichkeit aber auch longs), ansonsten mußte das Ergebnis selber dem passendem Typ zuordnen