この問題を処理するZend_Crypt_Math_BigInteger_Bcmath
とのコードを調べただけです。Zend_Crypt_Math_BigInteger_Gmp
BCmath (ビッグエンディアン) の使用
これは基本的にChad Birchによって投稿されたソリューションです。
public static function bc_binaryToInteger($operand)
{
$result = '0';
while (strlen($operand)) {
$ord = ord(substr($operand, 0, 1));
$result = bcadd(bcmul($result, 256), $ord);
$operand = substr($operand, 1);
}
return $result;
}
GMP (ビッグエンディアン) の使用
同じアルゴリズム - 関数名が異なるだけです。
public static function gmp_binaryToInteger($operand)
{
$result = '0';
while (strlen($operand)) {
$ord = ord(substr($operand, 0, 1));
$result = gmp_add(gmp_mul($result, 256), $ord);
$operand = substr($operand, 1);
}
return gmp_strval($result);
}
リテ エンディアンのバイト順を使用するようにアルゴリズムを変更するのは非常に簡単です。バイナリ データを最初から最後まで読み取るだけです。
BCmath (リテエンディアン) の使用
public static function bc_binaryToInteger($operand)
{
// Just reverse the binray data
$operand = strrev($operand);
$result = '0';
while (strlen($operand)) {
$ord = ord(substr($operand, 0, 1));
$result = bcadd(bcmul($result, 256), $ord);
$operand = substr($operand, 1);
}
return $result;
}
GMP (リテエンディアン) の使用
public static function gmp_binaryToInteger($operand)
{
// Just reverse the binray data
$operand = strrev($operand);
$result = '0';
while (strlen($operand)) {
$ord = ord(substr($operand, 0, 1));
$result = gmp_add(gmp_mul($result, 256), $ord);
$operand = substr($operand, 1);
}
return gmp_strval($result);
}