Задать вопрос
dollar
@dollar
Делай добро и бросай его в воду.

Как проверить, что ip находится в заданном диапазоне?

Например, есть диапазон:
var range = "91.108.56.0/22"; //именно в таком формате

И есть ip:
var ip = "91.108.57.58";
Нужно определить, попадает ли ip в диапазон или нет.
  • Вопрос задан
  • 284 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
dollar
@dollar Автор вопроса
Делай добро и бросай его в воду.
const ip4ToInt = ip =>
  ip.split('.').reduce((int, oct) => (int << 8) + parseInt(oct, 10), 0) >>> 0;

const isIp4InCidr = ip => cidr => {
  const [range, bits = 32] = cidr.split('/');
  const mask = ~(2 ** (32 - bits) - 1);
  return (ip4ToInt(ip) & mask) === (ip4ToInt(range) & mask);
};

const isIp4InCidrs = (ip, cidrs) => cidrs.some(isIp4InCidr(ip));

isIp4InCidrs('192.168.1.5', ['10.10.0.0/16', '192.168.1.1/24']); // true
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
BuriK666
@BuriK666
Компьютерный псих
https://stackoverflow.com/questions/19913694/how-c...
Сеть:
Address:   91.108.56.0          01011011.01101100.001110 00.00000000
Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
=>
Network:   91.108.56.0/22       01011011.01101100.001110 00.00000000


Адрес:
Address:   91.108.57.58         01011011.01101100.001110 01.00111010
Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
=>
Network:   91.108.56.0/22       01011011.01101100.001110 00.00000000
Network - совпадает, значит они в одной подсети.

Address:   91.108.51.1          01011011.01101100.001100 11.00000001
Netmask:   255.255.252.0 = 22   11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255            00000000.00000000.000000 11.11111111
=>
Network:   91.108.48.0/22       01011011.01101100.001100 00.00000000
Тут сеть отличается.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы