PHP:使用overflow将大整数从字符串转换为int

时间:2011-10-28 10:32:23

标签: php int unsigned ipv4

PHP不支持无符号整数。 有没有办法将无符号整数的字符串表示转换为带溢出的有符号整数?

例:
在32位系统上,PHP可以存储int值< = 2147483647.我想要一种方法将字符串“2147483648”转换为整数,使其溢出到-2147483648而不是减少到2147483647。

为什么我要这样做?
我将IPv4地址作为unsigned int(32位)存储在数据库中。我想对PHP中的地址进行二进制操作以检查子网。这需要在每个请求上完成,因此需要快速。因此,最好将IP地址存储为unsigned int,而不是存储必须来回转换的字符串。

3 个答案:

答案 0 :(得分:4)

这是解决方法。

<?php
    $unsignedString = "3000000000";
    echo "unsigned string: ".$unsignedString."<br />";
    $signedInt = intval(doubleval($unsignedString));
    echo "signed int: ".$signedInt."<br />";
?>

答案 1 :(得分:0)

最快,最简单的方法是让你的RDBMS以某种方式完成它。

通过检查预定义常量PHP_INT_SIZE的值,可以找出PHP中整数的大小。如果在32位系统上运行,则为4;如果在64位系统上运行,则为8。

我建议您使用例如

填充变量
$smallIntegers = intval(PHP_INT_SIZE == 4);

然后在您的查询中使用以下内容:

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

答案 2 :(得分:0)

你能将IP地址存储在一个整数数组中,IP的一个部分存储到数组的每个部分,因此最大值最终会以255存储在任何一个整数中:

$ipAddress = array(127, 0, 0, 1);