准确可靠的PHP中的Base36?

时间:2014-03-27 23:54:22

标签: php

到目前为止,这是我的代码:

function base36($value, $return_size)
{
    $base36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $buffer = str_pad("", $return_size);
    $offset = $return_size;

    do {
        $buffer[--$offset] = $base36[$value % 36];
    } while ($value /= 36);

    return $buffer;
}

$value: 64bit integer
$return_size: the expected size in bytes the function should return

它无法正常工作,因为$ value是64位整数,因为PHP会强制双重划分。当它大约是64位整数时,PHP似乎非常有限。如何让上面的代码像完全C版本一样工作?

1 个答案:

答案 0 :(得分:3)

本机:

base_convert是一个恰好完成您想要做的功能。

string base_convert ( string $number , int $frombase , int $tobase )

它的输入结构限制在底座2和底座36之间,因此它涵盖了您所需的内容。它很可能(像许多其他PHP函数一样)只是C库原件上的一个轻量级包装器。

GMP:

gmp_strval是另一个恰好完成你想要做的功能 - 它也有更好的精度(因为GMP是一个多精度算术库)。

需要使用gmp_init从字符串初始化GMP值,并在所有后续GMP算术函数调用中使用结果值(是资源)。

它具有更多的可用基数(从2到62)但由于需要初始化值并将它们用作资源,因此使用起来有点不太有趣。

如果您运行PHP 5.6,那么不太有趣的部分是不正确的,因为GMP会重载该版本中的算术运算符,从而允许通过使用运算符来减少GMP对象(资源?)等。

这是一个简单的GMP转换函数示例,不需要使用gmp_init初始化值:

function gmp_convert($num, $base_a, $base_b)
{
    return gmp_strval ( gmp_init($num, $base_a), $base_b );
}