Interprétation des mapIDs dans un paquet

Inscrit
1 Juin 2020
Messages
43
Reactions
29
#1
Bien le bonjour. Je fais un post sur le forum en espérant avoir une réponse de votre part :)

Je veux juste comprendre le mapID dans un paquet. Je remarque qu'il ne correspond jamais au réel mapID qui est renvoyé dans le jeu.
Exemple : Dans mon paquet j'ai ça


1605800789898.png


Qui correspond ensuite en décimal a ça :

1605800801962.png


Sauf qu'IG le mapID n'est évidemment pas un chiffre aussi grand.
Par ailleurs , j'ai remarqué que dans le D2O qui parle des maps, les ID sont des chiffres immenses sous la forme "1.79789078E7 " par exemple...

Ce qui me fait suggérer qu'entre le mapID IG et le mapID dans les paquets, ya une étape supplémentaire ..

Je suis sur ne pas m'etre trompé dans l'interprétation du paquet qui met le mapID sur un double. Et dans la suite de mon interprétation, les informations que j'ai correspondent.
 
Inscrit
1 Juin 2020
Messages
43
Reactions
29
#2
Je me permet donc de UP ce post et d'y apporter des précisions pour etre plus précis.

Voila le début du paquet
1606126763471.png


Voila le début du JSON concernant le protocolID 4631.

1606126810824.png


J'ai donc un startMapId écrit sur un double ( donc 8 bytes qu'on soit en 32 ou 64 ) et j'obtiens ce nombre : 4191800404000000 en hexa et donc : 4724698238823694000 en décimale.

Le fait est que le réel mapId de cette map est 73400577.

Ma question se résume donc a savoir comment je passe de 4191800404000000 a 73400577 ?


EDIT : Vu que ça fait 5 jours que je suis la dessus j'ai enfin fini par comprendre ou était le problème et je partage donc la solution pour ceux qui traverseraient ce problème.

En gros, de ce que je comprends, la conversion ne se fait pas de l'hexadecimal vers le décimal, mais de l'hex vers le "double"' pour le mapID. Je présume que pour les autres types ( writeInt par exemple), il faut aussi faire une conversion vers le type auxquels ils correspondent ..? En fait je comprends pas .. Pour moi , int, double , short, c'était simplement des unités de stockage, pas des système de nombre ( binaire, hexa, décimal etc ). J'ai donc du mal a voir comment je passe d'un hexa a un "double"' ( ça ne fait aucun sens pour moi ) mais je dois manquer de connaissances. Bref voila un lien pour convertir de l'hexa vers le double :

https://gregstoll.com/~gregstoll/floattohex/
 
Dernière édition:
Inscrit
20 Juin 2016
Messages
41
Reactions
2
#3
Je me permet donc de UP ce post et d'y apporter des précisions pour etre plus précis.

Voila le début du paquet
Afficher la pièce jointe 489


Voila le début du JSON concernant le protocolID 4631.

Afficher la pièce jointe 490


J'ai donc un startMapId écrit sur un double ( donc 8 bytes qu'on soit en 32 ou 64 ) et j'obtiens ce nombre : 4191800404000000 en hexa et donc : 4724698238823694000 en décimale.

Le fait est que le réel mapId de cette map est 73400577.

Ma question se résume donc a savoir comment je passe de 4191800404000000 a 73400577 ?


EDIT : Vu que ça fait 5 jours que je suis la dessus j'ai enfin fini par comprendre ou était le problème et je partage donc la solution pour ceux qui traverseraient ce problème.

En gros, de ce que je comprends, la conversion ne se fait pas de l'hexadecimal vers le décimal, mais de l'hex vers le "double"' pour le mapID. Je présume que pour les autres types ( writeInt par exemple), il faut aussi faire une conversion vers le type auxquels ils correspondent ..? En fait je comprends pas .. Pour moi , int, double , short, c'était simplement des unités de stockage, pas des système de nombre ( binaire, hexa, décimal etc ). J'ai donc du mal a voir comment je passe d'un hexa a un "double"' ( ça ne fait aucun sens pour moi ) mais je dois manquer de connaissances. Bref voila un lien pour convertir de l'hexa vers le double :

https://gregstoll.com/~gregstoll/floattohex/
Pour être clair, l'hexadécimal c'est juste une réprésentation en base 16 d'un nombre binaire.

Pour les entiers :

Un short c'est codé sur 16 bits, soit pour 1 : 0000 0000 0000 0001
Un int c'est codé sur 32 bits, soit pour 1 : 0000 0000 0000 0000 0000 0000 0000 0001

Si par exemple le nombre est un int x = 1; si tu lis en tant que short tu vas lire seulements les 16 premiers bits, c'est à dire 0., et le reste de bits ... soit il sera jamais lu soit tu vas lire comme la variable suivante et tout mélanger.

Ce n'est pas des unités de stockage mais plutôt l'indication du nombre de bits sur lequel ton nombre est codé.

Pour les nombres décimaux (flottant) :

Un float c'est codé sur 32 bits, un double sur 64 bits (mais l'idée est la même c'est la précision qui change).

Le 1er bit représentera le signe (positif ou négatif)
Les 8 bits suivant l'exposant
Les 23 bits suivant la mantisse

Pour coder un float tu commences par l'écrire sous la forme 1, XXX * 2^(n)

n c'est l'exposant et XXX la mantisse

Donc en plus d'indiquer le nombre de bits, short/int/double/... indique aussi quel bits correspondent à quoi.
 
Haut Bas