Php Pack() zu Autoit Hilfe

  • Hallo ich versuche grade ein php script in autoit zu übersetzen

    [autoit]

    function sendItem($itemid, $itemname, $itemcount)
    {
    global $player, $sindex, $mssql_db;
    $user_online=mssql_query("SELECT [MultiServer] FROM [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [m_idPlayer] = {$player}");
    $ison=mssql_fetch_array($user_online);
    if( $ison['MultiServer'] != 0 ){
    $Server_IP = '127.0.0.1';
    $m_idPlayer = (INT)$player;
    $ItemIDa = $itemid;
    $ItemCnt = $itemcount;

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $packet = pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);

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

    if(socket_connect($socket, $Server_IP, 29000))
    socket_write($socket, $packet, strlen($packet));
    socket_close($socket);
    $return = 1;
    }else{
    mssql_select_db($mssql_db['character']);
    $stmt = mssql_init('shopSendItem');

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

    mssql_bind($stmt, '@m_idPlayer', $player, SQLCHAR);
    mssql_bind($stmt, '@serverindex', $sindex, SQLCHAR);
    mssql_bind($stmt, '@item_name', $itemname, SQLTEXT);
    mssql_bind($stmt, '@item_count', $itemcount, SQLINT1);
    mssql_bind($stmt, '@item_id', $itemid, SQLINT1);

    $return = mssql_execute($stmt);

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

    mssql_free_statement($stmt);
    }
    return $return;
    }

    [/autoit]


    ich scheiter blos bei der zeile

    [autoit]

    $packet = pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);

    [/autoit]


    würde mich freuen wen mir da wer helfen könnte

    Mfg sedas

  • Stringtobinary habe ich auch dran gedacht blos das pack("VVV" definiert glaube ich 32bit
    Siehe:


    pack()-Formatzeichen
    Code Beschreibung
    a mit NUL gefüllte Zeichenkette
    A mit Leerzeichen gefüllte Zeichenkette
    h Hex-Zeichenkette, unterer Halbwert zuerst
    H Hex-Zeichenkette, oberer Halbwert zuerst
    c vorzeichenbehaftetes Zeichen
    C vorzeichenloses Zeichen
    s vorzeichenbehafteter Short-Typ (immer 16 Bit, Byte-Folge maschinenabhängig)
    S vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge maschinenabhängig)
    n vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Big Endian)
    v vorzeichenloser Short-Typ (immer 16 Bit, Byte-Folge Little Endian)
    i vorzeichenbehaftete Ganzzahl (Größe und Byte-Folge maschinenabhängig)
    I vorzeichenlose Ganzzahl (Größe und Byte-Folge maschinenabhängig)
    l vorzeichenbehafteter Long-Typ (immer 32 Bit, Byte-Folge maschinenabhängig)
    L vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge maschinenabhängig)
    N vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Big Endian)
    V vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Little Endian)
    f Gleitkommazahl (maschinenabhängige Größe und Wiedergabe)
    d Double-Typ (maschinenabhängige Größe und Wiedergabe)
    x NUL Byte
    X geht in der Zeichenkette ein Byte rückwärts
    @ NUL-Auffüllung bis zur absoluten Position

    • Offizieller Beitrag

    Wenn ich das richtig verstanden habe, sollte das hier funzen:

    Spoiler anzeigen
    [autoit]

    #Region - TimeStamp
    ; 2012-02-18 11:58:16
    #EndRegion - TimeStamp

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

    Local $vInt[2] = [25, 75]
    ConsoleWrite(_PackInt32($vInt) & @CRLF)

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

    Local $s = '0000000000000000000000000001100100000000000000000000000001001011'
    $aReturn = _UnPackInt32($s)
    For $i = 0 To UBound($aReturn) -1
    ConsoleWrite($aReturn[$i] & @CRLF)
    Next

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

    Func _PackInt32($vArg) ; == entspricht pack() mit Format 'V' für alle Argumente (einzeln oder im Array übergeben)
    If Not IsArray($vArg) Then $vArg = StringSplit($vArg, @CR, 2)
    Local $sRet = '', $sBin
    For $i = 0 To UBound($vArg) -1
    $sBin = StringRight('0000000000000000000000000000000' & _IntToBin($vArg[$i]), 32)
    $sRet &= $sBin
    Next
    Return $sRet
    EndFunc

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

    Func _UnPackInt32($sBin)
    Local $sArg = ''
    While StringLen($sBin) > 0
    $sArg &= StringLeft($sBin, 32) & '|'
    $sBin = StringTrimLeft($sBin, 32)
    WEnd
    Local $aArg = StringSplit(StringTrimRight($sArg, 1), '|')
    Local $aRet[$aArg[0]]
    For $i = 1 To $aArg[0]
    $aRet[$i-1] = _BinToInt($aArg[$i])
    Next
    Return $aRet
    EndFunc

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

    ;==============================================================================
    ; Wandelt einen Integerwert in eine Dualzahl
    ;==============================================================================
    Func _IntToBin($Value)
    $bin = ''
    Do
    $bin = Mod($Value, 2) & $bin
    $Value = Floor($Value/2)
    Until $Value = 0
    Return $bin
    EndFunc ;==>_IntToBin

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

    ;==============================================================================
    ; Wandelt eine Dualzahl in einen Integerwert
    ;==============================================================================
    Func _BinToInt($sBin)
    Local $iVal = 0, $aSplit = StringRegExp($sBin, '\d', 3)
    For $i = UBound($aSplit) -1 To 0 Step -1
    $iVal += $aSplit[$i] * (2^(UBound($aSplit)-1 -$i))
    Next
    Return $iVal
    EndFunc ;==>_BinToInt

    [/autoit]
  • also muss ich die funktion so schreiben
    pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt)
    =
    _PackInt32("01"& $m_idPlayer&"0"&$ItemIDa& $ItemCnt)

    weil da ja 5x V steht und in der funktions beschreiben ist ja nur 1xV oder muss ich so schreiben
    _PackInt32("VVVV01"& $m_idPlayer&"0"&$ItemIDa& $ItemCnt)

    • Offizieller Beitrag

    Ich hab doch ein kleines Bsp. gemacht und auch extra geschrieben: Mehrere Werte als Array übergeben, einzelne brauchen nicht in ein Array gepackt werden.
    Also mach ein Array:

    [autoit]

    Local $array[5] = [ Wert1, Wert2, Wert3, Wert4, Wert5 ]

    [/autoit]


    und ruf die Funktion mit diesem Array auf. Alle Werte werden zu einem String verpackt. Und die Option 'V' ist in der Funktion ja integriert, deshalb heisst sie auch _PackInt32() ;)

  • also für die zeile hier

    PHP
    $packet = pack("VVVVV", 01, $m_idPlayer, 0, $ItemIDa, $ItemCnt) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);

    muss ich so machen

    [autoit]

    $m_idPlayer = "000003"
    $ItemIDa = "21"
    $ItemCnt = "2"
    Local $vInt[5] = [01, $m_idPlayer,0,$ItemIDa,$ItemCnt]
    $packet = _PackInt32($vInt)&StringFormat("%-21s", "8b8d0c753894b018ce454b2e")&_PackInt32("1")

    [/autoit]
  • BugFix die funktion von dir abreit nicht ganu wie die von php. wen man den php pack string an autoit über tcp sendet was man mit pack nur machen kann kommt sowas
    <?php
    $Server_IP = '127.0.0.1';
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $packet = pack("VVVVV", 01,894, 0, 12004, 1) . str_pad("8b8d0c753894b018ce454b2e", 21, ' ') . pack("V", 1);

    if(socket_connect($socket, $Server_IP, 29000))
    socket_write($socket, $packet, strlen($packet));
    socket_close($socket);
    $return = 1;
    ?>

    0x010000007E03000000000000E42E00000100000038623864306337353338393462303138636534353462326501000000

    das gleiche mit dein script ist anderns

  • DLLStructCreate sollte perfekt passen.

    [autoit]

    $struct = DLLStructCreate("dword packetType ;dword playerId; dword dummy;dword itemID;dword ItemCnt;")

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

    _DLLStructFromBinary($struct, "0x010000007E03000000000000E42E00000100000038623864306337353338393462303138636534353462326501000000")
    For $i = 1 To 5
    ConsoleWrite(DllStructGetData($struct, $i) & @LF)
    Next

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

    Func _DLLStructFromBinary($tStruct, $bBinary)
    Local $r = DllStructSetData(DllStructCreate("byte[" & DllStructGetSize($tStruct) & "]", DllStructGetPtr($tStruct)), 1, $bBinary)
    Return SetError(@error, @extended, $r)
    EndFunc

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

    Func _DLLStructToBinary($tStruct)
    Local $r = DllStructGetData(DllStructCreate("byte[" & DllStructGetSize($tStruct) & "]", DllStructGetPtr($tStruct)), 1)
    SetError(@error, @extended)
    Return $r
    EndFunc

    [/autoit]
  • So. Das ist jetzt nur nicht ganz vollständig, nur der erste Teil ohne str_pad usw.

    [autoit]

    $struct = DLLStructCreate("dword packetType ;dword playerId; dword dummy;dword itemID;dword ItemCnt;")
    DLLStructSetData($struct, "packetType", 1)
    DLLStructSetData($struct, "playerId", 874)
    DLLStructSetData($struct, "itemID", 12356)
    DLLStructSetData($struct, "itemCnt", 1)

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

    ConsoleWrite(_DLLStructToBinary($struct) & @LF)

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

    Func _DLLStructFromBinary($tStruct, $bBinary)
    Local $r = DllStructSetData(DllStructCreate("byte[" & DllStructGetSize($tStruct) & "]", DllStructGetPtr($tStruct)), 1, $bBinary)
    Return SetError(@error, @extended, $r)
    EndFunc

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

    Func _DLLStructToBinary($tStruct)
    Local $r = DllStructGetData(DllStructCreate("byte[" & DllStructGetSize($tStruct) & "]", DllStructGetPtr($tStruct)), 1)
    SetError(@error, @extended)
    Return $r
    EndFunc

    [/autoit]
  • ZU GEIL!!! ES GEHT!!!!! GEPRIESEN SEI progandy^^ ich würde dich jetz gerne abküssen 1 woche haue ich mein kopf dran kaput^^ das str_pad ist stringtobinary