Re: [Sources] Overedge Bot pour tous les débutants en vb.net
bon une erreur a été resolue
on ecrit les octets recus mais dans le cas ou on recevait plusieur paquet pour faire une seul message ca posait un probleme
avec la correction ca donne ca :
Public Sub parsing(ByVal data() As Byte)
Try
Dim index As Integer ' pour savoir ou on est
Dim id_and_length As UShort ' les 2 premiers octets (16 bits)
Dim packet_id As UShort ' les 14 premiers bits des 16
Dim packet_length_of As Byte ' les 2 derniers bits des 16
Dim packet_length As Integer ' la longueur du packet
Dim Packet_Start As Integer
Dim Packet_End As Integer
If Waiting > 1 Then ' le buffer etait trop petit ?
Dim data_temps(data.Length + Data_Out.Length - 1) As Byte ' on créé un tableau de byte temporaire
Array.Copy(Data_Out, 0, data_temps, 0, Data_Out.Length) ' on met le debut du paquet trop long dans le tableau temporaire
Array.Copy(data, 0, data_temps, Data_Out.Length, data.Length) ' on met la reception a la suite
data = data_temps ' on met le tableau temporaire dans le tableau de travail
End If
Do Until index = data.Length ' on traite jusque la fin
Packet_Start = index
id_and_length = data(index) * 256 + data(index + 1) ' les 2 premiers octets
packet_length_of = id_and_length And 3 ' on veut les 2 derniers bits donc on masque (and) avec 11 en binaire (3 en decimal)
packet_id = id_and_length >> 2 ' on veut les 14 premiers bits donc on decale les 16 bits de 2 bits vers la droite
index += 2 + packet_length_of ' on avance des 2 octets de id_and_length + du nombre d'octets de la taille de taille
Select Case packet_length_of ' on lit le bon nombre d'octet pour connaitre la taille des données
Case 0
packet_length = 0
Case 1
packet_length = data(index - 1)
Case 2
packet_length = 256 * data(index - 2) + data(index - 1)
Case 3
packet_length = 65536 * data(index - 3) + 256 * data(index - 2) + data(index - 1)
End Select
If index + packet_length > data.Length Then ' buffer trop petit ?
Waiting = packet_length + index - Packet_Start ' alors on le signale
ReDim Data_Out(data.Length - Packet_Start - 1) ' on redimensionne le tableau de debut du paquet trop long
Array.Copy(data, Packet_Start, Data_Out, 0, data.Length - Packet_Start) ' on copie le debut du paquet trop long
Exit Sub ' on sort
End If
Dim debug As String = "recu : id = " & packet_id & ", taille = " & packet_length & vbCrLf ' on ecrit l'ID et la taille
Dim packet(0) As Byte ' on prepare le paquet
If packet_length > 0 Then ' si sa taille est plus grande que 0 on redimensionne
ReDim packet(packet_length - 1)
Array.Copy(data, index, packet, 0, packet_length) ' et on copie les donnée
End If
Dim j As Integer = 1
For i = 0 To packet_length - 1 ' on fait defiler tout les octets recus
debug &= packet(i).ToString("X2") & " " ' on ecrit l'octet proprement pour de bon ce coup ci
j += 1
If j = 16 Then
debug &= vbCrLf
j = 1
End If
Next ' au suivant
Log.Invoke(loger, debug & vbCrLf) ' voila plus rien a ecrire
DataCheck(packet_id, New Dofus.DofusReader(New IO.MemoryStream(packet))) ' on verra plus tard
index += packet_length ' on met l'index a jour
Packet_End = index
If Packet_End = data.Length Then ' si ca tombe pile poil alors le buffer etait assez grand
Waiting = 0 ' on reset
ReDim Data_Out(0) ' on reset
End If
Loop
Catch e As Exception
Console.WriteLine("parsing() " & e.TargetSite.Name & " -> " & e.Message)
End Try
End Sub
cette ligne a changer :
debug &= buffer(i).ToString("X2") ' on ecrit l'octet proprement
par
debug &= packet(i).ToString("X2") ' on ecrit l'octet proprement pour de bon ce coup ci
j'en ai profité pour mettre tout dans une string pour pas avoir 50 000 invoke mais un seul ce qui accelere l'ecriture
mettez pour tout aligner correctement la font de la textbox Log = Consolas
ce super tuto https://cadernis.com/d/304 est donc toujours valable (il ecrit pas les octets recus par le parsing mais par le thread de reception qui lui utilise vraiment buffer et pas packet)