/** * Turn a binary back into a long * @param string $b * @return integer * @url http://openidenabled.com Borrowed from PHP-OpenID */ function long($b) { $bytes = array_merge(unpack('C*', $b)); $n = 0; foreach ($bytes as $byte) { $n = bmmul($n, bmpow(2, 8)); $n = bmadd($n, $byte); } return $n; }
function bmmul($l, $r) { if (function_exists('bcmul')) { return bcmul($l, $r); } if (function_exists('gmp_mul')) { return gmp_strval(gmp_mul($l, $r)); } $l = strval($l); $r = strval($r); $v = '0'; $z = ''; for ($i = strlen($r) - 1; $i >= 0; $i--) { $bd = (int) $r[$i]; $carry = 0; $p = ""; for ($j = strlen($l) - 1; $j >= 0; $j--) { $ad = (int) $l[$j]; $pd = $ad * $bd + $carry; if ($pd <= 9) { $carry = 0; } else { $carry = (int) ($pd / 10); $pd = $pd % 10; } $p = (string) $pd . $p; } if ($carry > 0) { $p = (string) $carry . $p; } $p = $p . $z; $z .= "0"; $v = bmadd($v, $p); } return $v; }