Преобразование IP-адреса в число: - PullRequest
6 голосов
/ 28 мая 2010

Вопрос: Когда я конвертирую IP-адрес 192.168.115.67 в число, это делается так:
192 * 256 3 + 168 * 256 2 + 115 * 256 1 + 67 * 256 0 = 3232265027

или вот так:
192 * 256 0 + 168 * 256 1 + 115 * 256 2 + 67 * 256 3 = 1131653312

Я нахожу оба варианта онлайн, и, честно говоря, это не имеет значения, пока я выполняю все внутренние сравнения IP-диапазонов, используя один и тот же вариант процесса преобразования. Но я хочу вычислить IP V6 из адреса IPv4, и кажется, что оба варианта есть в сети ... в результате разные IPv6-адреса, и только один может быть правильным ...

Я использую вариант 1131653312, так как 1131653312 - это вариант, который я видел в .NET, но 3232265027 - это вариант, который я использовал, когда делал это в C ++, и это также вариант, который я нахожу в Интернете для преобразования IPv4 в IPv6, который я использовал прежде, чем увидел, что .NET использует вариант 1131653312 ...

Ответы [ 4 ]

5 голосов
/ 28 мая 2010

Это определенно первый. Вы можете пропинговать и посмотреть, как утилита ping преобразует его в нотацию .b.c.d. Если вы собираетесь сделать это преобразование, я рекомендую выражение: (a << 24) | (b << 16) | (c << 8) | d

4 голосов
/ 28 мая 2010

Метод, приводящий к 3232265027, должен быть правильным, так как первое число сохраняется в старших битах части совместимости IPv4 IPv6:

0000: 0000: 0000: 0000: 0000: FFFF: ААББ: CCDD

, где

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

и т.д.

https://wikipedia.org/wiki/IPv6

Кроме того, у вас не может быть 256 в IP-адресе. Значения от 0 до 255.

0 голосов
/ 28 мая 2010

Разница связана с порядком байтов . Вы храните его в целом числе, но разные процессоры имеют разные порядки байтов для своих целых чисел (сначала большой или маленький конец). Однако это число должно выходить за черту, поэтому IP имеет определенный порядок, в котором необходимо передать байты. Этот порядок отличается от бигендовских и лендендовских машин.

0 голосов
/ 28 мая 2010

Числа отправляются в порядке с прямым порядком байтов по проводам, что совпадает с тем, как они записаны (192 - самый старший байт). Таким образом, первое число является «правильным». Другой вариант - то, как те же байты будут интерпретироваться в архитектуре с прямым порядком байтов, следовательно, поведение .Net.

Сказав все это, я действительно не уверен, в чем вопрос, поэтому я могу только надеяться, что эта экспозиция представляет собой своего рода ответ.

...