PHP: преобразование большого целого числа из строки в int с переполнением - PullRequest
0 голосов
/ 28 октября 2011

PHP не поддерживает целые числа без знака. Есть ли способ преобразовать строковое представление целого без знака в целое число со знаком с переполнением?

Пример:
В 32-битной системе PHP может хранить значения int

Почему я хочу это сделать?
Я храню адреса IPv4 в базе данных как целые числа без знака (32 бита). Я хочу сделать бинарные операции с адресами в PHP, чтобы проверить наличие подсетей. Это должно быть сделано при каждом запросе, поэтому оно должно быть быстрым. Поэтому, кажется, лучше хранить IP-адрес как беззнаковое целое, чем хранить строку, которую нужно будет конвертировать туда и обратно.

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

вот обходной путь.

<?php
    $unsignedString = "3000000000";
    echo "unsigned string: ".$unsignedString."<br />";
    $signedInt = intval(doubleval($unsignedString));
    echo "signed int: ".$signedInt."<br />";
?>
0 голосов
/ 28 октября 2011

Не могли бы вы сохранить IP-адрес в целочисленном массиве, по одному сегменту IP на каждую часть массива, чтобы максимальное значение получилось как 255, сохраненное в любом одном целом числе:

$ipAddress = array(127, 0, 0, 1);
0 голосов
/ 28 октября 2011

Самый быстрый и простой способ сделать это - заставить СУБД как-то это сделать.

Вы можете узнать, каков размер целого числа в PHP, проверив значение предопределенной константы PHP_INT_SIZE.Это будет 4, если работает в 32-битной системе, 8, если работает в 64-битной системе.

Я предлагаю заполнить переменную, например,

$smallIntegers = intval(PHP_INT_SIZE == 4);

, а затемв вашем запросе используйте что-то вроде этого:

SELECT
    ...,
    CASE
        WHEN :smallIntegers: = 1 AND IPAddress > 2147483647 THEN IPAddress - 4294967296
        ELSE IPAddress
    END AS IPAddress,
    ...
...
...