2010-05-28 13 views
7

Pregunta: al convertir la dirección IP 192.168.115.67 a un número, ¿Se hace así:
192 * 256 + 168 * 256 * 256 + 67 * 256 = 3232265027

o como esto:
192 * 256 + 168 * 256 + 115 * 256 + 67 * 256 = 1131653312

Encuentro ambas variantes en línea, y francamente no importa siempre que haga toda la comparación del rango de IP interno usando la misma variante del proceso de conversión. Pero quiero para calcular el V6 IP desde la dirección IPv4, y parece que ambas variantes son en la web ... que resulta en diferentes direcciones IPv6, y sólo uno puede ser correcta ...

uso el 1131653312 variante, como 1131653312 es la variante que vi .NET dándome, pero 3232265027 es la variante que utilicé cuando lo hice en C++, y esa es también la variante que encuentro en la web para la conversión de IPv4 a IPv6, y que utilicé antes Vi que .NET usa la variante 1131653312 ...la conversión de una dirección IP a un número:

Respuesta

5

El método que resulta en 3232265027 debe ser correcta, ya que el primer número se almacena en los bits más altos de la parte de la compatibilidad IPv4 de IPv6:

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

donde

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

etc.

http://wikipedia.org/wiki/IPv6

Además, no se puede tener un 256 en una dirección IP. Los valores son 0 - 255 cada uno.

0

Los números se envían en orden big-endian a través del cable, que es igual a la forma en que están escritos (192 es el byte más significativo). Por lo tanto, el primer número es el "correcto". La otra variante es cómo se interpretarán los mismos bytes en una arquitectura little-endian, de ahí el comportamiento .Net.

Habiendo dicho todo eso, realmente no estoy seguro de cuál es la pregunta, por lo que solo puedo esperar que esta exposición sea una especie de respuesta.

+0

La pregunta es, ¿cómo el IP v6 (correcto) busca el IP v4 dado? –

+0

Quandary, modifique su respuesta para que quede claro. –

5

es definitivamente el primero. puede hacer ping y ver cómo la utilidad ping lo convierte a una notación a.b.c.d. si va a hacer esta conversión, recomiendo la expresión: (a << 24) | (b << 16) | (c << 8) | d

+0

¿por qué downvoting? – Andrey

+0

Realmente no se puede decir eso; depende de la endianidad de su plataforma. OK, bueno, supongo que puedes, ya que .NET no se transporta exactamente a un montón de plataformas diferentes. Pero, en principio, no puedes decir eso. –

+0

@ T.E.D. como número se verá como 3232265027. La segunda pregunta es cómo se almacena en la memoria, y ese punto no lo mencioné en absoluto. – Andrey

0

La diferencia tiene que ver con endianness. Lo está almacenando en un número entero, pero diferentes procesadores tienen diferentes ordenamientos de bytes para sus enteros (primero grande o pequeño). Sin embargo, ese número tiene que salir a través de la línea, por lo que IP tiene un orden específico que necesita los bytes transferidos. Ese orden se ve diferente a las máquinas bigendian y littleendian.

+0

No sé mucho sobre el hardware .net cross diferente, sin embargo, ¿no se supone .net que se abstraiga el byte para enteros? –