Соответствие IP к маске CIDR в PHP 5?

Вы можете назначить chooseIndex свойству index экземпляра, а затем вернуть экземпляр, а затем setValue просмотреть индекс, который был присвоен:

[114 ]

class multipleActionObject {
  constructor(arr) {
    this.arr = arr;
  }
  chooseIndex(index) {
    this._index = index;
    return this;
  }
  setValue(value) {
    if (typeof this._index !== 'number') {
      throw new Error('No index to set value of');
    }
    this.arr[this._index] = value;
    return this;
  }
}
const instance = new multipleActionObject([0, 1, 2, 3]);
instance.chooseIndex(4).setValue(10);
console.log(instance.arr[4]);

Это называется «цепочкой методов», хотя здесь кажется немного странным отделять выбранный элемент от действия, выполняемого над этим объектом. [ 118]

51
задан Simon East 19 May 2016 в 19:59
поделиться

3 ответа

Только используя IPv4:

  • использование ip2long() для преобразования дюйм/с и диапазона подсетей в длинных целых
  • преобразовывает/xx в маску подсети
  • , делают поразрядное 'и' (т.е. IP & маска)' и проверка это, что 'результат = подсеть'

что-то вроде этого должно работать:

function cidr_match($ip, $range)
{
    list ($subnet, $bits) = explode('/', $range);
    if ($bits === null) {
        $bits = 32;
    }
    $ip = ip2long($ip);
    $subnet = ip2long($subnet);
    $mask = -1 << (32 - $bits);
    $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned
    return ($ip & $mask) == $subnet;
}
73
ответ дан Alnitak 7 November 2019 в 09:44
поделиться
function cidr_match($ipStr, $cidrStr) {
  $ip = ip2long($ipStr);
  $cidrArr = split('/',$cidrStr);
  $maskIP = ip2long($cidrArr[0]);
  $maskBits = 32 - $cidrArr[1];
  return (($ip>>$maskBits) == ($maskIP>>$maskBits));
}
1
ответ дан vartec 7 November 2019 в 09:44
поделиться

Я хочу, чтобы вы взглянули на мои несколько строк. Примеры, которые предлагали мне люди, похоже, не работают. Одна из причин, насколько я понимаю, заключается в том, что биты маски CIDR являются двоичными числами, поэтому сдвиг битов должен выполняться на двоичном числе. Я пробовал преобразовать длинный IP-адрес ' Хорошо, вот несколько строк ... Я жду ваших комментариев.

function cidr_match($ipStr, $cidrStr) {

$ipStr = explode('.', $ipStr);
foreach ($ipStr as $key => $val) {
    $ipStr[$key] = str_pad(decbin($val), 8, '0', STR_PAD_LEFT);
    }
$ip = '';
foreach ($ipStr as $binval) {
    $ip = $ip . $binval;
    }

$cidrArr = explode('/',$cidrStr);

$maskIP = explode('.', $cidrArr[0]);
foreach ($maskIP as $key => $val) {
    $maskIP[$key] = str_pad(decbin($val), 8, '0', STR_PAD_LEFT);
    }
$maskIP = '';
foreach ($ipStr as $binval) {
    $maskIP = $maskIP . $binval;
    }
$maskBits = 32 - $cidrArr[1];
return (($ip>>$maskBits) == ($maskIP>>$maskBits));  
}
0
ответ дан 7 November 2019 в 09:44
поделиться
Другие вопросы по тегам:

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