WebSocket Data decoding

06/23/2015 23:24 FacePalmMan#1
Da ich ein Clientless-bot für agar.io schreiben will, habe ich mich mit WebSocket beschäftigt, womit ich bis zur Connection-aufrechtererhaltung zumindest Erfolg hatte.
Ich habe (wie gesagt) es schon geschafft die Verbindung zum Server zu öffnen und aufrecht zu erhalten.
Nur habe ich ein Problem die empfangenen Nachrichten zu entschlüsseln/decoden.
Die Funktionen die ich benutze geben keine gültigen/auswertbare Zeichenketten zurück.
Ich hoffe ihr habt da irgendwelche Lösungsvorschläge.

Einige Funktionen/Teile des Scripts wurden aus anderen Foren kopiert und verändert um einen Client statt einem Server zu bilden.

Hier die Funktionen die euch sicherlich interessieren werden:

Code:
Func _EncodeWebSocketPacket($sPacket)
   Local $aFrame[4], $sEncoded, $iData_Length, $iFrameSize, $iIndex

   $sEncoded = ""
   $aFrame[0] = 129
   $iData_Length = StringLen($sPacket)

   If $iData_Length <= 125 Then
	  $aFrame[1] = $iData_Length
	  $iFrameSize = 1
   Else
	  $aFrame[1] = 126
	  $aFrame[2] = BitShift($iData_Length, 8) ;Bit verschiebung um n (z.B. 8) Bits nach rechts.
	  $aFrame[3] = BitAND($iData_Length, 255) ;Addiert die Bit von $iData_Length mit 11111111.
	  $iFrameSize = 3
   EndIf

   For $iIndex = 0 To $iFrameSize
	  $sEncoded &= Chr($aFrame[$iIndex])
   Next

   $sEncoded &= $sPacket

   Return $sEncoded
EndFunc
Func _DecodeWebSocketPacket($sPacket)
   Local $sBytes, $iData_Length, $sMask, $sEncoded, $sDecoded

   $sBytes = $sPacket
   $iData_Length = BitAND(Asc(_SubString($sBytes, 1, 1)), 127) ;Lösche das erste Bit
   $sDecoded = ""

   If $iData_Length = 126 Then
	  $sMask = _SubString($sBytes, 4, 8)
	  $sEncoded = _SubString($sBytes, 8)
   ElseIf $iData_Length = 127 Then
	  $sMask = _SubString($sBytes, 10, 14)
	  $sEncoded = _SubString($sBytes, 14)
   Else
	  $sMask = _SubString($sBytes, 2, 6)
	  $sEncoded = _SubString($sBytes, 6)
   EndIf

   $iIndex = 0
   Do
	  $sDecoded &= Chr(BitXOR(Asc(_SubString($sEncoded, $iIndex, 1)), Asc(_SubString($sMask, Mod($iIndex, 4), 1)))) ;Verwende das Byte $iIndex von $sEncoded und das Byte $iIndex welches beim Mod 4 ermittelt wird von $sMask
	  ;Mache daraus einen Ascii-Code und errechne den XOR wert der beiden Bytes. Dann wandle das ganze wieder in einen Lesbaren Character um.

	  $iIndex += 1
   Until $iIndex > StringLen($sEncoded)-1

   Return $sDecoded
EndFunc

Func _SubString($sString, $iBeginn, $iCount = 0);Ja ich weiss das es eine ähnliche Funktion in AutoIt gibt, fiel mir aber zuspät ein.
   If $iBeginn < 0 Then
	  Return StringRight($sString, ($iBeginn*-1))
   EndIf

   If $iBeginn > 0 Then
	  $sString = StringTrimLeft ($sString, $iBeginn)
   EndIf

   If $iCount = 0 Then
	  $iCount = StringLen($sString)
   EndIf

   Return StringLeft($sString, $iCount)
EndFunc