Convert to Uint32, Uint8 oder int16

  • Hallo

    Mal wieder stehe ich auf dem Schlauch.
    Ich befasse mich momentan noch einmal mit dem Tinkerforge Projekt.
    ( Da es aber hier um konvertierung geht habe ich ein neues Thema erstellt und nicht das Alte benutzt )
    Damit man mit der Hardware mittels TCP/IP kommunizieren kann
    muss man die Werte in Uint32, Uint8 oder int16 wandeln.

    Im Paket Layout von TF wird beschrieben wie vorgegangen wird. Das ganze muss dann vorwärts und rückwärts funktionieren.
    Als Bsp. sieht das so aus

    Code
    UID 33688 as uint32 (0x98 0x83 0x00 0x00)


    Ich muss also von 33688 auf 0x98 0x83 0x00 0x00 bzw. 98830000 kommen.
    Oder...

    Code
    x -239 as int16 (0x11 0xff)


    -239 als int16 0x11 0xff bzw. 11ff

    Ich habe schon im Inet danach gesucht aber leider nicht das richtige gefunden.
    Vielleich weiß einer wie das geht.
    Vielen dank schon mal

    MFG Chris :D

    • Offizieller Beitrag

    So:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    ; UID 33688 as uint32 (0x98 0x83 0x00 0x00)
    $uid = 33688
    $array = uint32_Array($uid)
    _ArrayDisplay($array)
    $string = uint32_String($uid)
    MsgBox(0, '', $string)

    [/autoit] [autoit][/autoit] [autoit]

    Func uint32_Array($uint32)
    Local $string = Hex(Int($uint32, 1), 8), $aOut[4]
    For $i = 0 To 3
    $aOut[3 - $i] = '0x' & StringMid($string, $i * 2 + 1, 2)
    Next
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func uint32_String($uint32)
    Local $string = Hex(Int($uint32, 1), 8), $sOut
    For $i = 0 To 3
    $sOut = StringMid($string, $i * 2 + 1, 2) & $sOut
    Next
    Return $sOut
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Oder gleich nativ...

    Spoiler anzeigen
    [autoit]


    $tStruct = DllStructCreate("uint convert32; short convert16;byte convert8")
    $tStruct.convert32 = 33688
    $tStruct.convert16 = 33688;Achtung! signed short, nicht unsigned short
    $tStruct.convert8 = 33688;Passt hinten und vorne nicht. int8 kann nur ein byte (0-255) aufnehmen. Uint8 sollte nicht mehr verwendet werden, gibt es in AutoIt deswegen auch nicht mehr, da müsstest du ggf. selbst Hand anlegen
    ConsoleWrite(Binary($tStruct.convert32) & @CRLF)
    ConsoleWrite(Binary($tStruct.convert16) & @CRLF)
    ConsoleWrite(Binary($tStruct.convert8) & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    Geht auch mit 3.3.8.1 (warum benutzt du die Alte denn noch?)

    Spoiler anzeigen
    [autoit]

    $tStruct = DllStructCreate("uint convert32; short convert16;byte convert8")
    DllStructSetData($tStruct,"convert32",33688)
    DllStructSetData($tStruct,"convert16",33688);Achtung! signed short, nicht unsigned short
    DllStructSetData($tStruct,"convert8",33688);Passt hinten und vorne nicht. int8 kann nur ein byte (0-255) aufnehmen.
    ConsoleWrite(Binary(DllStructGetData($tStruct,"convert32")) & @CRLF)
    ConsoleWrite(Binary(DllStructGetData($tStruct,"convert16")) & @CRLF)
    ConsoleWrite(Binary(DllStructGetData($tStruct,"convert8")) & @CRLF)

    [/autoit]
  • Hi,

    ich rate dir DRINGEND, sämtliche Funktionen deiner (nicht nur der mir bekannten ;) ) Projekte in Verbindung mit den neueren AutoIt-Versionen zu überprüfen, sowohl auf die allgemeine Funktion, als auch auf die Ergebnisse!
    Ich habe die 3.3.8.1 in Produktivumgebung laufen, und habe damit bisher noch keinerlei Probleme oder gar Einschränkungen festgestellt.

    Solltest du trotzdem eine der neueren Versionen in Erwägung ziehen, würde ich diese komplett auf einer eigenen Maschine/Account neu installieren. Keinesfalls über die "alte" 3.3.8.1-Version "drüberbügeln"!
    Dann kannst du gefahrlos die neueren AutoIt-Versionen mit deinen Projekten testen und im Bedarfsfall wieder auf DEINE 3.3.8.1 zurückgreifen!

    • Offizieller Beitrag

    HEy,

    Einfach das Binary() wegnehmen oder mit Int()

    Spoiler anzeigen
    [autoit]

    $tStruct = DllStructCreate("uint convert32;")
    DllStructSetData($tStruct, "convert32", 33688)
    $uint32 = Binary(DllStructGetData($tStruct, "convert32"))
    $default = DllStructGetData($tStruct, "convert32")

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("Uint32: " & $uint32 & @CRLF)
    ConsoleWrite("Default: " & $default & @CRLF)
    ConsoleWrite("Uint32 -> Int: " & Int($uint32) & @CRLF)

    [/autoit]

    Gruß,
    Spider

  • @spider

    Ich habe noch ein Problem im TF Projekt mit der Umwandlung
    Der Weg zum berechnen einer UDI eines Bausteines geht so...

     UID = 6xicsa = Base58 Decode => 3635950641 = Uint32 => 3134B8D8

    Jetzt führe ich eine Funktion aus die mit ein Callback Paket mit allen angeschlossenen Bausteinen schickt..
    http://www.tinkerforge.com/de/doc/Low_Lev…LBACK_ENUMERATE

    Dann bekomme ich als Antwort folgendes zurück

    Spoiler anzeigen
    [autoit]


    ;~ Zwei Geräte sind angeschlossen...

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Receive Code: ACCEPT: 0x3134B8D822FD080036786963736100003000000000000000300200000203000D0000
    ;~ Receive Code: ACCEPT: 0x4493000022FD08006364310000000000367869637361000063010200020006D40000

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Receive Code zerlegt....
    ;~
    ;~ Seq Flg
    ;~ === UID === Le Fu ----- |-> Payload
    ;~ 31 34 B8 D8 22 FD 08 00 36 78 69 63 73 61 00 00 30 00 00 00 00 00 00 00 30 02 00 00 02 03 00 0D 00 00
    ;~ 44 93 00 00 22 FD 08 00 63 64 31 00 00 00 00 00 36 78 69 63 73 61 00 00 63 01 02 00 02 00 06 D4 00 00

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Payload ist der eigentliche Callback...
    ;~ Wenn ich das richtig verstanden habe wird er so zerlegt ( laut dem link Oben )...

    [/autoit] [autoit][/autoit] [autoit]

    ;~ uid char[8] connected_uid char[8] char hardw_v uint8[3] softw_v uint8[3] ...
    ;~ ----------------------- ----------------------- -- -------- ----------------- ...
    ;~ 36 78 69 63 73 61 00 00 30 00 00 00 00 00 00 00 30 02 00 00 02 03 00 ...

    [/autoit] [autoit][/autoit] [autoit]

    ;~ 36 78 69 63 73 61 00 00 => Müsste mit BASE58 eigentlich 6xicsa ergeben. Geht aber nicht..

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    So wie das aussieht brauche ich also wieder eine Umwandlung die char[8] bzw char heißt..??

    Als zweite Frage... In dem Beispiel das du oben geschrieben hast mit der Uint32...usw.
    Wie füge ich da noch einen Uint16 hinzu?
    Vielen Dank schon mal

    MFG chris :D

    • Offizieller Beitrag

    Hey,

    Hilfe anschauen ;) uint16 --> ushort

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $tData = DllStructCreate("byte data[1024]")

    [/autoit] [autoit][/autoit] [autoit]

    ;Hier kommen dann deine TCP Recv Funktion hin

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $sRecv = TCPRecv(..)
    $sRecv = Binary("0x3678696373610000300000000000000030020000020300")
    $tData.data = $sRecv

    [/autoit] [autoit][/autoit] [autoit]

    $tCALLBACK_FORCED_ACK = DllStructCreate("char uid[8];char connected_uid[8];char position;byte hardware_version[3]; byte firmware_version[3];ushort device_identifier;byte enumeration_type",DllStructGetPtr($tData))

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(DllStructGetData($tCALLBACK_FORCED_ACK,"uid") & @CRLF)

    [/autoit]

    Gruß,
    Spider