你可以寫一些類似pack()
,使用bc工作與大數字。這是我的快速解決方案,它用13個字符的字符串轉換你的第二個數字。很不錯 !
<?php
$i2 = "201103231043330478311223582826";
function pack_large($i) {
$ret = '';
while(bccomp($i, 0) !== 0) {
$mod = bcmod($i, 256);
$i = bcsub($i, $mod);
$ret .= chr($mod);
$i = bcdiv($i, 256);
}
return $ret;
}
function unpack_large($s) {
$ret = '0';
$len = strlen($s);
for($i = $len - 1; $i >= 0; --$i) {
$add = ord($s[$i]);
$ret = bcmul($ret, 256);
$ret = bcadd($ret, $add);
}
return $ret;
}
var_dump($i2);
var_dump($pack = pack_large($i2));
var_dump(unpack_large($pack));
輸出示例:
string(30) "201103231043330478311223582826"
string(13) "jàÙl¹9±̉"
string(47) "201103231043330478311223582826.0000000000000000"
由於需要URL友好字符,在包裝的字符串中使用base64_encode
,這會給你一個20個字符的字符串(18,如果你刪除了填充)。
這是真的16位數的秒級? – zneak 2011-03-24 18:39:24
如果我的數學是正確的,你需要使用base-54編碼。區分大小寫的字母數字編碼(base-62)應該足夠了。有沒有理由爲什麼這不起作用?你需要看代碼嗎? – Seth 2011-03-24 18:44:06