Salut,
pour t'aider, il faut savoir qu'une adresse IP est souvent écrite dans une chaîne de caractère. Et c'est le cas ici, même si elle est un peu étrange.
Donc quand tu fait des opérations sur les caractères, tu devrait le faire avec d'autre caractère ^^
tu as une valeur 48 qui semble un peu étrange, mais en vérité, si tu la convertie en code ascii cela donne le caractère zéro '0'.
Donc si je ré-écrit cela (en C/C++, mais l'idée est la même) :
int a = (int)(c - '0');
int b = (int)(c[i + 1] - '0');
Tu pourrait alors demander :
Mais cela sert à quoi de soustraire un caractère à un autre ?
tout simplement à récupérer la valeur qui correspond au caractère, c'est pas forcement très claire alors voila des exemples:
'0' - '0' = 48 - 48 = 0
'1' - '0' = 49 - 48 = 1
'2' - '0' = 50 - 48 = 2
...
'9' - '0' = 57 - 48 = 9
...
'?' - '0' = 63 - 48 = 15
On voit que cela marche bien :p !
Pour la ligne suivante :
toto.Add((a & 15) << 4 | b & 15);
Lorsque l'on fait du traitement bit à bit, la notation hexadécimal ou binaire des nombres est plus judicieuse:
toto.Add((a & 0b1111) << 4 | b & 0b1111);
Du coup, maintenant, on voit plus clairement qu'on stock les 4 premiers bit de a et b dans un seul octet.
Et si on réfléchi un peu, nos valeurs sont des nombres entre 0 et 15, cela tient donc juste dans 4 bits, cela veut dire qu'on ne perd pas d'information dans a et b.
Et la donnée reconstitué est un octet, il en faut 4 pour faire une adresse IP. (en IP V4 en tout cas)
Cela tombe bien il y a une boucle qui parcours chaque caractères de la chaîne, et il y a 8 caractères.
Maintenant tu as juste à faire l’opération inverse : prendre les 4 octets de l'IP, chaque octet est découpé en bloc de 4 bits, qui sont convertis en code ASCII lisible.
C'est important de bien comprendre un algo avant de faire le changement de langage, et encore plus pour faire la fonction inverse.
J’espère que cela va t'aider !
Bonne chance