2010-05-28 5 views
7

Question: Quand je convertir l'adresse IP 192.168.115.67 à un certain nombre, il est fait comme ceci:
192 * 256 + 168 * 256 +115 * 256 + 67 * 256 = 3232265027

ou comme ceci: 192 * + 168 * 256 + 115 * 256 + 67 * 256Je trouve les deux variantes en ligne, et franchement, cela n'a pas d'importance tant que je fais toute la comparaison de plage IP interne en utilisant la même variante de processus de conversion. Mais je veux calculer le V6 IP à partir de l'adresse IPv4, et il semble que les deux variantes sont sur le web ... résultant de différentes adresses IPv6, et un seul peut être correct ...

J'utilise le 1131653312 variante, comme 1131653312 est la variante que j'ai vu .NET qui me donne, mais 3232265027 est la variante que j'ai utilisée quand je l'ai fait en C++, et c'est aussi la variante que je trouve sur le web pour la conversion IPv4 en IPv6, et que j'ai utilisé auparavant J'ai vu que .NET utilise la variante 1131653312 ...La conversion d'une adresse IP à un numéro:

Répondre

5

Le procédé résultant en 3232265027 doit être correcte, que le premier numéro est enregistré dans les bits les plus élevées de la part de compatibilité IPv4 IPv6:

0000: 0000: 0000: 0000: 0000: ffff: AABB: CCDD

AA = 192
BB = 168
CC = 0
DD = 1

etc.

http://wikipedia.org/wiki/IPv6

En outre, vous ne pouvez pas avoir un 256 dans une adresse IP. Les valeurs sont de 0 à 255 chacune.

0

Les nombres sont envoyés dans l'ordre big-endian sur le fil, qui est la même que la façon dont ils sont écrits (192 est l'octet le plus significatif). Ainsi le premier nombre est le "bon". L'autre variante est de savoir comment les mêmes octets seront interprétés sur une architecture little-endian, d'où le comportement .Net. Cela dit, je ne sais pas vraiment quelle est la question, alors je ne peux qu'espérer que cette exposition constitue une sorte de réponse.

+0

La question est de savoir comment l'IP v6 (correct) recherche l'IP v4 donnée. –

+0

Quand, modifiez votre réponse pour le rendre clair. –

5

c'est certainement le premier. vous pouvez faire un ping et voir comment l'utilitaire ping le convertit en notation a.b.c.d. si vous allez faire cette conversion, je recommande l'expression: (a << 24) | (b << 16) | (c << 8) | d

+0

pourquoi downvoting? – Andrey

+0

Vous ne pouvez pas vraiment dire ça; cela dépend de l'endianness de sa plate-forme. OK, eh bien, je suppose que vous le pouvez, car .NET n'est pas exactement porté sur un tas de plates-formes différentes. Mais en principe, vous ne pouvez pas vraiment dire cela. –

+0

@ T.E.D. comme un nombre, il ressemblera à 3232265027. La deuxième question est de savoir comment il est stocké dans la mémoire, et ce point que je n'ai pas mentionné du tout. – Andrey

0

La différence a à voir avec endianness. Vous le stockez dans un nombre entier, mais différents processeurs ont des ordres d'octets différents pour leurs entiers (grande ou petite fin en premier). Cependant, ce nombre doit sortir sur la ligne, donc IP a un ordre spécifique dont il a besoin pour les octets transférés. Cet ordre est différent des machines bigendian et littleendian.

+0

Je ne sais pas beaucoup de choses sur .net traverser le matériel différent, mais n'est pas .net en place pour le déplacement de byte abstraite pour les entiers? –