在JAVA中从基础X转换为基础Y返回的不同于PHP中的相同函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAVA中从基础X转换为基础Y返回的不同于PHP中的相同函数相关的知识,希望对你有一定的参考价值。

我在JAVA中创建了一个方法,以便对现有的php函数执行相同的操作,即:将任意大小的数字从任何基数转换为任何基数。

java方法工作正常,我可以将数字从一个基数转换为另一个,然后将其转换回来,但结果字符串与PHP函数不同。这对我来说是一个问题,因为我想在PHP中转换一个数字,然后在JAVA中将其转换回来。

例如,让我们将字母998765;43210;9999;2中的数字0123456789;从Base11转换为带有PHP和JAVA字母0123456789ABCDEFGHIJK的Base21:

PHP中示例的结果:

convBase("998765;43210;9999;2", "0123456789;", "0123456789ABCDEFGHIJK") = "GJK7K6B2KKGKK96"

JAVA中示例的结果:

convBase("998765;43210;9999;2", "0123456789;", "0123456789ABCDEFGHIJK") = "1B0EJAJ0IG3DABI"

我希望结果是一样的,所以我可以在PHP中转换一个数字并将其转换回JAVA。

我认为问题可能是字符编码,但我不知道如何解决它。

PHP函数和测试:

<?php
    function convBase($numberInput, $fromBaseInput, $toBaseInput)
    {
        if ($fromBaseInput==$toBaseInput) return $numberInput;
        $fromBase = str_split($fromBaseInput,1);
        $toBase = str_split($toBaseInput,1);
        $number = str_split($numberInput,1);
        $fromLen=strlen($fromBaseInput);
        $toLen=strlen($toBaseInput);
        $numberLen=strlen($numberInput);
        $retval='';
        if ($toBaseInput == '0123456789')
        {
            $retval=0;
            for ($i = 1;$i <= $numberLen; $i++)
                $retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
                return $retval;
        }
        if ($fromBaseInput != '0123456789')
            $base10=convBase($numberInput, $fromBaseInput, '0123456789');
            else
            $base10 = $numberInput;
            if ($base10<strlen($toBaseInput))
                return $toBase[$base10];
                while($base10 != '0')
                {
                    $retval = $toBase[bcmod($base10,$toLen)].$retval;
                    $base10 = bcdiv($base10,$toLen,0);
                    }
                    return $retval;
    }

    header('Content-Type: text/html; charset=utf-8');

    $number = "998765;43210;9999;2";
    $fromBase = "0123456789;";
    $toBase = "0123456789ABCDEFGHIJK";

    $converted = convBase($number, $fromBase, $toBase);
    $back = convBase($converted, $toBase, $fromBase);

    echo "Number: ".$number."<br>";
    echo "Converted: ".$converted."<br>";
    echo "Back: ".$back."<br>";
?>

JAVA方法和测试:

import java.math.BigInteger;

public class ConvBase{

    public static String convBase(String number, String fromBaseInput, String toBaseInput){

        if (fromBaseInput.equals(toBaseInput))
            return number;

        BigInteger fromLen = new BigInteger(""+fromBaseInput.length());
        BigInteger toLen = new BigInteger(""+toBaseInput.length());
        BigInteger numberLen = new BigInteger(""+number.length());

        if(toBaseInput.equals("0123456789")){
            BigInteger retval = BigInteger.ZERO;
            for(int i=1; i<=number.length(); i++){
                retval = retval.add(
                    new BigInteger(""+fromBaseInput.indexOf(number.charAt(i-1))).multiply(
                        fromLen.pow(numberLen.subtract(new BigInteger(""+i)).intValue())
                        //pow(fromLen, numberLen.subtract(new BigInteger(""+i)))
                    ) 
                );
            }
            return ""+retval;
        }

        String base10 = fromBaseInput.equals("0123456789") ? number : convBase(number, fromBaseInput, "0123456789");

        if(new BigInteger(base10).compareTo(toLen) < 0)
            return ""+toBaseInput.charAt(Integer.parseInt(base10));

        String retVal = "";
        BigInteger base10bigInt = new BigInteger(base10);
        while(!base10bigInt.equals(BigInteger.ZERO)){
            retVal = toBaseInput.charAt(base10bigInt.mod(toLen).intValue()) + retVal;
            base10bigInt = base10bigInt.divide(toLen); 
        }
        return ""+retVal;
    }

    public static void main(String[] args) {
        String number = "98765;43210;9999;2";
        String fromBase = "0123456789;";
        String toBase = "0123456789ABCDEFGHIJK";

        String converted = ConvBase.convBase(number, fromBase, toBase);
        String back = ConvBase.convBase(converted, toBase, fromBase);

        System.out.println("Number = "+number);
        System.out.println("Converted = "+converted);
        System.out.println("Back = "+back); 

        System.exit(0);
    }
}
答案

您的测试用例中存在拼写错误。这两个程序似乎都是正确的,或者至少是一致的。

当您的PHP程序转换为“998765; 43210; 9999; 2”时,您的Java变体将转换为“98765; 43210; 9999; 2”。注意开头的两个9。当我更改数字时,我得到以下输出:

Number = 998765;43210;9999;2
Converted = GJK7K6B2KKGKK96
Back = 998765;43210;9999;2

这与PHP版本的输出一致。

以上是关于在JAVA中从基础X转换为基础Y返回的不同于PHP中的相同函数的主要内容,如果未能解决你的问题,请参考以下文章

Python基础函数

Python开发基础 day10 内置函数 匿名函数 递归

java基础课程第二章编程题

Java中从LocalDateTime到joda DateTime的不正确日期转换

python的函数参数基础(可能和别人讲的不一样,稍微深入一点)

php基础2