Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在PHP中对二进制字符串执行二进制数学运算?_Php - Fatal编程技术网

有没有一种方法可以在PHP中对二进制字符串执行二进制数学运算?

有没有一种方法可以在PHP中对二进制字符串执行二进制数学运算?,php,Php,我正在处理一些对PHP来说太大而无法处理的数字(二进制的IPv6地址),因此为了解决这个问题,我制定了一个函数,将地址转换为二进制字符串(实际上只是一个1和0的字符串)。然而,当涉及到子网计算时,我知道的最简单的方法是使用二进制数学。我不知道在这个例子中如何使用二进制数学,因为我在技术上处理的是字符串,而不是二进制数。有什么方法可以用二进制数的字符串表示法进行二进制数学吗?处理大二进制数时,可以使用。它接受任意长度的字符串作为参数。我一想,答案其实很简单。我刚刚编写了自己的函数,将数组拆分为32

我正在处理一些对PHP来说太大而无法处理的数字(二进制的IPv6地址),因此为了解决这个问题,我制定了一个函数,将地址转换为二进制字符串(实际上只是一个1和0的字符串)。然而,当涉及到子网计算时,我知道的最简单的方法是使用二进制数学。我不知道在这个例子中如何使用二进制数学,因为我在技术上处理的是字符串,而不是二进制数。有什么方法可以用二进制数的字符串表示法进行二进制数学吗?

处理大二进制数时,可以使用。它接受任意长度的字符串作为参数。

我一想,答案其实很简单。我刚刚编写了自己的函数,将数组拆分为32个字符段(考虑到32位系统兼容性,因为在32位PHP实现中,2^32是整数的最高值),对每个段执行操作,然后将其重新拼接在一起。但是,该函数强制执行128的二进制字符串长度(如果传入,则填充较短的字符串),这就是我所需要的。它可以很容易地修改,以允许任何长度的二进制字符串。以下是函数:

function ipm_binmath($a, $b, $operand){
    $binregex = "/\b[01]*\b/";
    if (strlen($a) > 128 || strlen($b) > 128){
        throw new Exception("ipm_binmath accepts binary strings no greater than 128 characters.");
    }

    preg_match($binregex, $a, $amatches);
    preg_match($binregex, $b, $bmatches);

    if ($amatches[0] != $a){
        throw new Exception("Invalid data passed to ipm_binmath - \$a is not a binary string.");
    }
    if ($bmatches[0] != $b){
        throw new Exception("Invalid data passed to ipm_binmath - \$b is not a binary string.");
    }

    $aarr = str_split(str_pad($a, 128, "0", STR_PAD_LEFT), 32);
    $barr = str_split(str_pad($b, 128, "0", STR_PAD_LEFT), 32);
    $ret = "";

    for ($i=0; $i<4; $i++){
        switch (strtoupper(trim($operand))){
            case "AND":
                $ret .= str_pad(decbin((bindec($aarr[$i]) & bindec($barr[$i]))), 32, "0", STR_PAD_LEFT);
                break;
            case "OR":
                $ret .= str_pad(decbin((bindec($aarr[$i]) | bindec($barr[$i]))), 32, "0", STR_PAD_LEFT);
                break;
            case "XOR":
                $ret .= str_pad(decbin((bindec($aarr[$i]) ^ bindec($barr[$i]))), 32, "0", STR_PAD_LEFT);
                break;
            default:
                throw new Exception("Unsupported or invalid operand passed to ipm_binmath: '" . $operand . "'");
                break;
        }
    }
    return $ret;
}
函数ipm\u binmath($a、$b、$operand){
$binregex=“/\b[01]*\b/”;
如果(斯特伦($a)>128 | |斯特伦($b)>128){
抛出新异常(“ipm_binmath接受不超过128个字符的二进制字符串”);
}
预赛($binregex,$a,$amatches);
预赛($binregex,$b,$b比赛);
如果($amatches[0]!=$a){
抛出新异常(“传递给ipm\u binmath的无效数据-\$a不是二进制字符串”);
}
如果($b匹配[0]!=$b){
抛出新异常(“传递给ipm\u binmath的无效数据-\$b不是二进制字符串”);
}
$aarr=str_分割(str_焊盘($a,128,“0”,str_焊盘左),32);
$barr=str_split(str_pad($b,128,“0”,str_pad_LEFT),32);
$ret=“”;

对于($i=0;$i您在寻找哪种数学?因为对于掩蔽和范围
substr
strcmp
&
stru repeat
几乎就足够了。嗯,肯定和/或,可能还有XOR。可能还有更多,但我知道肯定需要这三种。嗯,在这种情况下可能会有帮助。快速浏览一下,看起来很准确我很喜欢我要找的。我会在接下来的几个小时内测试一下,然后再给你回复。谢谢。