Дорога

Люблю дороги. И не я один. Есть в них что-то манящее, увлекательное. Хотя про саму жизнь такого бы не сказал. Что такое жизнь и зачем она? Каждый год наблюдаю за собой какие-то метаморфозы. Услышал очередное в свой адрес, что полмира объездил, а теперь вот не хочу/могу никуда ехать, как же так… Да вот так. Все меняется. Человек меняет. Мир вокруг меняет человека. Сегодня осень, а завтра зима.

Подумать только, полмира. А что это дало? Во всем должен быть какой-то смысл, иначе зачем… Иногда было весело. Иногда просто душа хотела. А сейчас будто все в необходимость превращается. Надо и все.

Еще вчера я мог переживать, что в компании могут ввести дресс-код. Сейчас же мне все равно. Сменю майку на рубашку и все. Мне это не сложно. Лишь бы всем этим стояло какое-то обоснование. Ибо вводить односторонние ограничения, ничего не давая в замен — лишь дополнительная демотивация. Равно как и штрафы за опоздание.

К чему я? Настроение меняется. Желания меняются.

Преобразовать IP адрес в целое число на PHP

Рассмотрим IP адрес версии 4. Он состоит из 4х октетов, 4 чисел, каждое из которых может быть от 0 до 255. По сути, каждое число имеет тип byte, состоит из 8 битов.

В интернете множество вариантов, как сделать конвертацию (1, 2). Наиболее наглядно, на мой взгляд, рассмотрели проблему здесь.

Сюда же я приведу свой вариант, реализованный на уровне бинарной обработки чисел. Кажется, он как обычно быстрее, чем все это варианты с перемножением и возведением в степень. Стоит упомянуть, что и в PHP, и в СУБД есть средства для конвертации IP в числе и обратно, так что данный пост имеет чисто академический смысл.


$ip = '70.112.108.147';
$arr = explode('.', $ip);

// для наглядности, что получается после смещений
echo decbin($arr[0]<<24) . "\n"; // 24 - это 3 блока по 8 нулей echo decbin($arr[1]<<16) . "\n"; // 16 - это 2 блока по 8 нулей echo decbin($arr[2]<<8) . "\n"; // 8 - это 1 блок по 8 нулей echo decbin($arr[3]) . "\n"; // оставляем как есть // теперь просто склеим все значения. Не просоммируем, а именно применим операцию OR, что-то вроде конкатенации $ipInt = $arr[0]<<24 | $arr[1]<<16 | $arr[2]<<8 | $arr[3]; var_dump($ipInt);