Wooh! Merci beaucoup pour ce commentaire ultra précis toons, je suis super content, y'a juste un truc qu'il faudrait que tu m'explique :p
La méthode que je pensais être la bonne:
Le code:
let buff = packetsData.get(1) // J'obtiens les données du packet protocolID = 1
let header = packetManager.handleHeader(buff) // J'extrait les infos des deux premiers bytes
let body = buff.slice(2, Buffer.byteLength(buff) ) // D'après openDofus, la têtes = 16 bits == 2 bytes
console.log('Buffer:\n', buff);
console.log('Tête du buffer:\n', header);
console.log('Corps du buffer:\n', body);
console.log('\n[METHODE 1] Infos tête du buffer:', header);
console.log('Infos corps du buffer', deserializeAsProtocolRequired(body) );
function deserializeAsProtocolRequired(buf) {
let reader = new bufferReader(buf)
let requiredVersion = buf.readInt32BE(0, 4) // Je recopie le fichier.as :p
if ( requiredVersion < 0 ) throw new Error('Invalid version !')
let currentVersion = buf.readInt32BE(4, 8)
if ( currentVersion < 0 ) throw new Error('An Error occurred in game version parsing ! :(')
return { requiredVersion: requiredVersion, currentVersion: currentVersion }
}
Méthode 1:
function handleHeader(packet) {
let header = packet.readInt16BE(0) // On lis les 16 premiers bytes pour avoir notre header.
let id = header >> 2 // On décale l'header de 2 bits pour avoir l'id.
let typeLen = header & 3 // BIN -> 1 = 0001, 2 -> 0010, 3 -> 0011
let messageLen = getBodySize( typeLen, packet )
return {id: id, typeLen: typeLen, messageLen: messageLen }
}
OUTPUT ( en retirant les throw new Error ):
> node test.js
Buffer:
<Buffer 00 05 08 00 00 06 b5 00 00 06 bb>
Tête du buffer:
{ id: 1, typeLen: 1, messageLen: 8 }
Corps du buffer:
<Buffer 08 00 00 06 b5 00 00 06 bb>
[METHODE 1] Infos tête du buffer: { id: 1, typeLen: 1, messageLen: 8 }
On peux clairement voir que ça merde ! :x
Avec l'explication de ToOns :
Le code reste inchangé sauf :
let body = buff.slice(3, Buffer.byteLength(buff) ) // D'après openDofus, la têtes = 16 bits == 2 bytes
En effet, je pensais que le header ne faisait que 2 bytes !
[CORRIGEZ MOI SI JE ME TROMPE]
Mais après réflexion, en regardant le schema sur openD,
(PacketID >> MessageLenghtType >> LenghtMessage >> Message)
Je me rend compte, que ce que je prenais pour header n'était que PacketID et MessageLengthType, sauf qu'il manque LengthMessage que je décode avec cette fonction :
function getBodySize (typeLen, buffer) {
let local5
let local6
let bLocal5
let bLocal6
switch ( typeLen ) {
case 1:
return buffer.readUInt8(2)
break;
case 2:
return buffer.readUInt16BE(2)
break;
case 3:
local5 = ( Buffer.byteLength( buffer, 'utf8' ) >> 16 ) & 0xFF // HEX -> 0xFF = BIN -> 1111 1111 = DECIMAL -> 255
local6 = Buffer.byteLength( buffer, 'utf8' ) & 0xFFFF // HEX -> OxFFFF = BIN -> 1111 1111 1111 1111 = DECIMAL -> 65 535
break;
default:
console.error(typeLen, 'is not a valid typeLen !');
return undefined
}
}
Faites pas attention à la case 3, c'est un échec de reverse enge. ^^
Du coup j'ai gardé 1 byte en plus, ce que m'a fucké tout le parsage de mon corps ! ^^'
Voilà voilà ! :)
[/CORRIGEZ MOI SI JE ME TROMPE]
Donc, maintenant si on exclut le troisième byte du corps, et que l'on utilise le même chemin qu'avant :
Output:
Infos corps du buffer { requiredVersion: 1717, currentVersion: 1723 }
OUIIIII OOOOOOOOOOOOUUUUUUUUUUUUIIIIIIIIIIII PUTAIN JE SUIS CHAUD LAA JE SUIS CHAAUD J'AI PARSE LE BUFFER PROTOCOLREQUIRED YA QUOOI ?!!!
Humm ! Désolé !
Bon bah voilà mon premier packet parsé que j'aurais jamais pus faire sans votre aide, @ToOnS et @dampenfr31 , c'est vraiment cool qu'il y est des gens comme vous qui prennent du temps pour aider les noobs comme moi vous ne pouvez pas imaginez la satisfaction que l'on à quand on à enfin compris le truc ! :)
Merci ! ;)