ASCII-HEX String in Val umwandeln

Anfängerfragen zum Programmieren mit PureBasic.
helitron
Beiträge: 10
Registriert: 19.12.2005 09:04

ASCII-HEX String in Val umwandeln

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
helitron
Beiträge: 10
Registriert: 19.12.2005 09:04

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
helitron
Beiträge: 10
Registriert: 19.12.2005 09:04

Beitrag 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:
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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))
Bild
Win11 Pro 64-Bit, PB_6.11b1
helitron
Beiträge: 10
Registriert: 19.12.2005 09:04

Beitrag 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))
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

deswegen der hinweis von Thomas: mit &$FF wird das vorzeichenbit "überlistet"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
helitron
Beiträge: 10
Registriert: 19.12.2005 09:04

Beitrag 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"
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten