2012-05-06 56 views
5

我想使用PHP轉換基數爲36的數字。函數base_convert不起作用,因爲我想轉換大數字:如果我再次將它從基數36轉換爲小數,我不會得到我的初始數字。十進制和基數之間的轉換36

我嘗試了在多個網站上給出的一些功能,但我從來沒有得到相同的結果。此外,這兩個網站(在Javascript)給出相同的結果:

例如1010701001118000000000000000必須被轉換到3IZS0ZE1RQ68W8SSW4

這裏是我試過的功能(和不工作):

+0

爲什麼不把你的號碼轉換成字符串,然後用base64編碼? – 2012-05-06 16:09:36

+0

這個想法是減少數字的長度。 – Yoone

+0

您是否需要將數字轉換回小數點? – Niko

回答

8

下面是使用維基百科上發現了一個算法,同時使用bcmath時獲得的計算即使是非常大的數字右邊的兩個簡單的功能:

function fromDecimalToBase($in, $to) { 
    $in = (string) $in; 
    $out = ''; 

    for ($i = strlen($in) - 1; $i >= 0; $i--) { 
     $out = base_convert(bcmod($in, $to), 10, $to) . $out; 
     $in = bcdiv($in, $to); 
    } 

    return preg_replace('/^0+/', '', $out); 
} 

function fromBaseToDecimal($in, $from) { 
    $in = (string) $in; 
    $out = ''; 

    for ($i = 0, $l = strlen($in); $i < $l; $i++) { 
     $x = base_convert(substr($in, $i, 1), $from, 10); 
     $out = bcadd(bcmul($out, $from), $x); 
    } 

    return preg_replace('/^0+/', '', $out); 
} 

不過,我得到3izs0ze1rq66tifrpc爲您提供的號碼 - 也許你的轉換在那裏是錯的?

+0

你得到了與其他答案相同的結果,也許Javascript轉換器是錯誤的......但我不知道如何找出答案。我可能不得不找到一個「完美」的轉換器知道... – Yoone

+0

@Yoone我已經將轉換加回到十進制,並且它似乎工作到目前爲止。 – Niko

+0

但是,我只能使用第一個,只需交換'$ from'和'$ to' :)。無論如何,我看到你使用PHP函數'base_convert',所以我認爲你的轉換是正確的。我會接受你的回答,謝謝! – Yoone

3

http://www.pgregg.com/projects/php/base_conversion/base_conversion.php

此頁面顯示如何轉換不同基地之間的任意長度數字。 我試過你的例子,它看起來像它在兩個方向工作。 使用PHP 編寫的源代碼可用

+0

我不知道哪個代碼是正確的,但是通過您的鏈接,我得到'3IZS0ZE1RQ66TIFRPC'而不是'3IZS0ZE1RQ68W8SSW4' – Yoone

+0

+1,因爲我接受的答案返回相同的結果。 – Yoone

相關問題