Seite 1 von 2

String in Hexadezimal

Verfasst: 24.10.2007 12:50
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!!!

Verfasst: 24.10.2007 13:06
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.

Verfasst: 24.10.2007 15:12
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

Verfasst: 24.10.2007 15:20
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:

Verfasst: 24.10.2007 16:03
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! <)

Verfasst: 24.10.2007 16:13
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 ;)

Verfasst: 24.10.2007 16:33
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   

Verfasst: 24.10.2007 16:47
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:

Verfasst: 24.10.2007 16:52
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:

Verfasst: 24.10.2007 19:29
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 !!