有没有一种方法可以在PHP中对二进制字符串执行二进制数学运算?
我正在处理一些对PHP来说太大而无法处理的数字(二进制的IPv6地址),因此为了解决这个问题,我制定了一个函数,将地址转换为二进制字符串(实际上只是一个1和0的字符串)。然而,当涉及到子网计算时,我知道的最简单的方法是使用二进制数学。我不知道在这个例子中如何使用二进制数学,因为我在技术上处理的是字符串,而不是二进制数。有什么方法可以用二进制数的字符串表示法进行二进制数学吗?处理大二进制数时,可以使用。它接受任意长度的字符串作为参数。我一想,答案其实很简单。我刚刚编写了自己的函数,将数组拆分为32个字符段(考虑到32位系统兼容性,因为在32位PHP实现中,2^32是整数的最高值),对每个段执行操作,然后将其重新拼接在一起。但是,该函数强制执行128的二进制字符串长度(如果传入,则填充较短的字符串),这就是我所需要的。它可以很容易地修改,以允许任何长度的二进制字符串。以下是函数:有没有一种方法可以在PHP中对二进制字符串执行二进制数学运算?,php,Php,我正在处理一些对PHP来说太大而无法处理的数字(二进制的IPv6地址),因此为了解决这个问题,我制定了一个函数,将地址转换为二进制字符串(实际上只是一个1和0的字符串)。然而,当涉及到子网计算时,我知道的最简单的方法是使用二进制数学。我不知道在这个例子中如何使用二进制数学,因为我在技术上处理的是字符串,而不是二进制数。有什么方法可以用二进制数的字符串表示法进行二进制数学吗?处理大二进制数时,可以使用。它接受任意长度的字符串作为参数。我一想,答案其实很简单。我刚刚编写了自己的函数,将数组拆分为32
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。可能还有更多,但我知道肯定需要这三种。嗯,在这种情况下可能会有帮助。快速浏览一下,看起来很准确我很喜欢我要找的。我会在接下来的几个小时内测试一下,然后再给你回复。谢谢。