Tuesday, February 28, 2012

base_convert で任意の基数に変換

PHP で任意の基数に変換できる base_convert という関数があることを知りました。

16進数/8進数/2進数と10進数を相互変換する関数は dechex decoct decbin がありますが、base_convert では任意の基数を指定できるため a-z を使った36進数も表現できます。

var_dump(base_convert('123456789', 10, 36)); // string(6) "21i3v9"
var_dump('21i3v9', 36, 10); // string(9) "123456789"

戻り値は string 型である点に注意しましょう。加えて大きい数値を変換では精度が失われ不正な値になります。

// 32bit
var_dump(base_convert(base_convert('9999999999999999', 10, 36), 36, 10));
// string(17) "10000000000000000" ... NG

// 64bit
var_dump(PHP_INT_MAX);
var_dump(base_convert(base_convert(PHP_INT_MAX + 1, 10, 36), 36, 10));
// int(9223372036854775807)
// string(16) "9223372036854818" ... NG
// PHP_INT_MAX + 1 は (float) "9.2233720368548E+18" のため誤って変換される。