2012-05-06 44 views
5

Tôi muốn chuyển đổi số trong cơ sở 36 bằng cách sử dụng PHP. Hàm base_convert không hoạt động vì tôi muốn chuyển đổi số lớn: Tôi không nhận được số ban đầu của mình nếu tôi chuyển đổi nó một lần nữa từ cơ số 36 sang thập phân.Chuyển đổi giữa số thập phân và cơ số 36

Tôi đã thử một số chức năng được cung cấp trên nhiều trang web, nhưng tôi không bao giờ nhận được kết quả tương tự. Ngoài ra, hai trang web này (trong Javascript) cho kết quả tương tự:

Ví dụ 1010701001118000000000000000 phải được chuyển đổi sang 3IZS0ZE1RQ68W8SSW4.

Sau đây là các chức năng tôi đã cố gắng (và đó không làm việc):

+0

tại sao không chuyển đổi số của bạn thành chuỗi và sau đó mã hóa bằng base64? –

+0

Ý tưởng là giảm độ dài của số. – Yoone

+0

Bạn có cần phải chuyển đổi số sang số thập phân tại một số điểm không? – Niko

Trả lời

8

Dưới đây là hai chức năng đơn giản sử dụng một thuật toán tìm thấy trên Wikipedia, trong khi sử dụng bcmath để có được tính toán ngay cả đối với số lượng rất lớn ngay:

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); 
} 

Tuy nhiên, tôi nhận được 3izs0ze1rq66tifrpc cho số bạn đã cung cấp - có thể chuyển đổi của bạn đã sai ở đó?

+0

Bạn nhận được kết quả tương tự như câu trả lời khác, có thể trình chuyển đổi Javascript sai ... Nhưng tôi không biết cách tìm hiểu. Tôi có thể phải tìm một công cụ chuyển đổi "hoàn hảo" để biết ... – Yoone

+0

@Yoone Tôi đã thêm chuyển đổi về số thập phân và có vẻ như nó hoạt động cho đến nay. – Niko

+0

Nhưng, tôi chỉ có thể sử dụng cái đầu tiên và chỉ trao đổi '$ từ' và' $ thành' :). Dù sao, tôi thấy rằng bạn sử dụng hàm PHP 'base_convert', vì vậy tôi nghĩ rằng chuyển đổi của bạn là đúng. Tôi sẽ chấp nhận câu trả lời của bạn, cảm ơn! – Yoone

3

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

Trang này cho bạn biết cách chuyển đổi các số chiều dài tùy ý giữa các cơ sở khác nhau. Tôi đã thử ví dụ của bạn và có vẻ như nó hoạt động theo cả hai hướng. Mã nguồn được viết bằng PHP có sẵn.

+0

Tôi không biết mã nào là đúng, nhưng với liên kết của bạn, tôi nhận được '3IZS0ZE1RQ66TIFRPC' thay vì' 3IZS0ZE1RQ68W8SSW4' – Yoone

+0

+1 vì câu trả lời tôi chấp nhận trả về cùng một kết quả. – Yoone

Các vấn đề liên quan