String in Hexadezimal

Anfängerfragen zum Programmieren mit PureBasic.
Caretaker
Beiträge: 9
Registriert: 14.09.2007 13:22

String in Hexadezimal

Beitrag von Caretaker »

Hi Leute,

ich hab mal wieder ein Problem!

Ich muss einen Comport auslesen und habe dies anhand dieses Codes geschafft.

Code: Alles auswählen

Dim Daten.w (1000)

MyCom.s = "Com1: baud=57600 parity=N data=8 stop=1"
HCom.l

HCom = ComOpen(MyCom,0,10000,10000)
If HCom
   Delay (5000)
        Stringlaenge.l = ComInputBufferCount(Hcom)
        
           Ausgabe.s = Space(Stringlaenge)             
           If ComRead(Hcom,@Ausgabe,Stringlaenge)
              
              Ausgabe1.s = ReplaceString(Ausgabe, "□","")
              Ausgabe1.s = ReplaceString(Ausgabe1, "□","")
              Ausgabe1.s = ReplaceString(Ausgabe1, "FFEM","")
              
              Tid.s=Mid(Ausgabe1,1,10)
              min.s=Mid(Ausgabe1,11,2)
              std.s=Mid(Ausgabe1,13,2)
              
              jahr.s=Mid(Ausgabe1,20,1)

        ;;;;;;Hier kommt noch die Ausgabe hin;;;;;

           EndIf
       ; EndIf
Else
MessageRequester("SerTest","Can't open the Com port", #MB_ICONERROR)
    End
EndIf

ComClose(hcom)
Die Daten, die ich ausgelesen bekomme werden in einem langen String ausgegeben (□FFEM0BD9060DC3581195C9077D□).

Aufgeschlüsselt

"FF" Seriennr. des Lesegerät
"EM" Weiß ich nicht
"0BD9060DC3" ID des Transponders
"5811" Uhrzeit (11:58 )
"95" Zutritt ok / Tag (95 = 10 01 0101) >> 10 = Zutritt ok / 01 0101 = 15
"C9" Anzahl der Tp's / Monat (C9 = 110 0 1001) >> 110 = Anzahlt der Tp's / 0 1001 = 9
"07" Jahr (2007)
"7D" CRC (PrüfBit)


Nun habe ich eine Möglichkeit gefunden, einzelne Segmente daraus zu entnehmen (Mid-Befehl).

Diese einzelnen Segmente möchte ich in Duale, Dezimale bzw. Hexadezimale Zahlen umwandeln.

Gibt es einen Befehl der mir dies ermöglicht ??

Oder habt ihr eine Idee wie klappen könnte ??



Ich danke Euch im Vorraus für Eure Hilfe!!!
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Ich wüsste jetzt spontan keine gegebene Funktion von PB, allerdings ist die Umrechnung doch relativ leicht zu machen.

Mach eine Procedur mit der Eingabe der Hexadezimalzahl. Diese liest du nun stelle für stelle aus und rechnest sie um.

zB
FF = 15*16+15 = 255
3D = 3*16+13
456 = 4*16*16+5*16+6

und gibst das Ergebnis zurück.

Dann noch eine für Dezimal -> Binär und du hast alles was du brauchst. Kannst natürlich auch beides in beide Richtungen rechnen lassen.
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag von Ligatur »

Wie währe es mit Bin(Val(Mid(Segment.s, Start, Länge))) (Binär) bzw. Val(Mid(Segment.s, Start, Länge)) (Dezimal). Hexadezimal hast du sie ja schon
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Sorry, ist nicht direkt zum Thema, aber wenn ich sowas sehe, dann will ich dir am liebsten doch glatt einen Tipp geben:

Code: Alles auswählen

              Ausgabe1.s = ReplaceString(Ausgabe, "□","") 
              Ausgabe1.s = ReplaceString(Ausgabe1, "□","") 
              Ausgabe1.s = ReplaceString(Ausgabe1, "FFEM","") 
Wie wär's denn mal mit RemoveString()? Sollte besser geeignet sein. :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

@AND51:
Der allerletzte Satz hätte einfach nur konstruktiv geholfen, mit dem Rest der Aussage hast du wenigstens unterstrichen, dass du schon ein überdurchschnittlicher Programmierer bist, und die Leute in der Anfängerecke sich schätzen dürfen, deinen Hochwohlintellektuellen Tip entgegennehmen zu dürfen.

Vor Allem, weils trotzdem funktionieren würde -.-

Edit: An Boardler mit Sarkasmusdetektor: Von diesem Post bitte fernhalten! Explosionsgefahr! <)
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Ligatur hat geschrieben:Wie währe es mit Bin(Val(Mid(Segment.s, Start, Länge))) (Binär) bzw. Val(Mid(Segment.s, Start, Länge)) (Dezimal). Hexadezimal hast du sie ja schon
Und wie soll das funktionieren?!

Code: Alles auswählen

Segment.s = "FFFFFF"

Debug Bin(Val(Mid(Segment.s, 1, 2)))
Egal wie man's dreht und wendet Val(String$) is immer 0 wenn man sich nicht an die Vorgaben für Val() hält...
Der String muss ein Integer-Wert im Dezimalformat sein.
@Caretaker
Zum umrechnen von hexa in dec/bin/octa/doudec etc gibt's im Forum genug beispiele (u.A. auch im CodeArchiv)

SuFu: dec bin

Ansonsten wenn du es selber schreiben willst:
http://www.arndt-bruenner.de/mathe/scri ... ysteme.htm
is sozusagen ne Umrechnungsanleitung für Dummys ;)
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Mh, ich kann uerer Verständnisproblem nachvollziehen, aber spaltet das Problem doch in Teilprobleme auf. 15 Minuten Coding (inklusive offene Wikiseite und Verstehen des Systems- hatte das zwar schon ein paar Male im Unterricht, hab aber nichts mehr genau da gehabt, woran ich mich 100%ig erinnern konnte.)

Code: Alles auswählen

sEingabe.s = "4FE"
sLiteral.s = ""
iMultiplikator.l
lErgebnis.l

For I=1 To Len(sEingabe)
  sLiteral = Mid(sEingabe,I,1)
  Select sLiteral
    Case "A"
       iMultiplikator = 10
    Case "B"
       iMultiplikator = 11
    Case "C"
       iMultiplikator = 12
    Case "D"
       iMultiplikator = 13         
    Case "E"
       iMultiplikator = 14
    Case "F"
       iMultiplikator = 15
    Default
       iMultiplikator = Val(sLiteral)
  EndSelect
  
  Debug sLiteral + " -->" + Str(iMultiplikator) + "*" + "16^" + Str(Len(sEingabe)-I) 
  
  
  lErgebnis = lErgebnis + iMultiplikator * Pow(16,Len(sEingabe)-I)
Next

Debug lErgebnis   
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>> Diese einzelnen Segmente möchte ich in Duale, Dezimale bzw. Hexadezimale Zahlen umwandeln.

hex zu dec geht hiermit: valHex(hexString)

Code: Alles auswählen

; valHex.pbi

Procedure valHex(string.s) ;v1.0
  Protected ret.l
  Protected len.l = Len(string)
  Protected i.l
  Protected char
  Protected signif.l
  For i=0 To len-1 :;Debug Mid(string,len-i,1)
    char = Asc(UCase(Mid(string,len-i,1)))
    If (char>=48 And char<=57)
      char = char-48
    ElseIf (char>=65 And char<=70)
      char = char-65 + 10
    Else
      ;++++++++
      Continue
      ;++++++++
    EndIf
    ret | (char<<(4*(signif)))
    signif+1
  Next
  ProcedureReturn ret
EndProcedure



For i=0 To 20
  r = Random($ffffff)
  Debug Hex(r) + "    " + Str(r) + "    " + Str( valHex( Hex(r)))
Next


hex zu bin geht hiermit: Bin( valHex(hexString) )
..und hex selber haste ja schon :wink:
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

@#Null: :allright: Finds cool mit den ASCII-Werten ;) Ist nur an sich ein wenig verworrener. Da es aber nur 6 Buchstaben sind, empfand ich es als zu dröselig.

Aber however: Kewle Version :mrgreen: :allright:
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Caretaker
Beiträge: 9
Registriert: 14.09.2007 13:22

Beitrag von Caretaker »

Vielen Dank für Eure schnellen Antworten!!!

Ihr habt mir schon sehr viel helfen können.

Damit werd ich auf jeden Fall weiter kommen.

DANKE !!
Antworten