AS3将大数转换为base16号

时间:2013-04-06 01:16:04

标签: actionscript-3 hex type-conversion

我正在尝试取一个字符串,将其转换为数字,将该数字转换为base16,然后将其转回字符串。

这是我到目前为止所拥有的:

var d:String = convertBase("123487032174829820348320429437483266812812");

function convertBase(inputInBase10:String):String
{
    var i = Number(inputInBase10);
    var u = i.toString(16);
    trace("i = " + i);
    trace("u = " + u);
    return dest;
}

以下是印刷品:

i = 1.23487032174829e+41
u = 16ae5514d07e12000000000000000000000

我正试图让u一直填写。我知道这个数字比那个更大。

2 个答案:

答案 0 :(得分:3)

作为IEEE-754双精度浮点数的数字没有准确表示您的值的精度;然而,差不多了。

BigInteger个实施,例如as3crypto,以及其他可实现任意长度的实施。

检查as3crypto的BigInteger toRadix()fromRadix()方法会产生:

    decimal: 123487032174829820348320429437483266812812
hexadecimal: 16ae5514d07e120126dfbcb3073fddb2b8c

示例:

import com.hurlant.math.BigInteger;

var n:BigInteger = new BigInteger();

n.fromRadix("123487032174829820348320429437483266812812", 10);
trace(n.toRadix(16));
trace(n.toRadix(10));

答案 1 :(得分:1)

请注意,这不是最有效的解决方案,但可行,因为您的数字不会很长(很长会意味着数千位小数)。下面的算法使用字符串来实现长除法以记录长数,然后重复地将前一除法的结果除以16,同时将余数记录到结果中。这为您提供了问题的解决方案。

下面的代码是用JavaScript编写的(对不起,我在这台机器上没有AS编译器),但只需添加适当的类型标记就可以让它看起来更加简单:

var source = "123487032174829820348320429437483266812812";

function longDivision(divident, quotient) {
    var i, digits = [], dividentPart = 0, resultDigits = [], nextDigit;
    for (i = 0; i < divident.length; i++) {
        digits[i] = parseInt(divident[i], 10);
    }
    i = 0;
    do {
        dividentPart = dividentPart * 10 + digits[i];
        if (dividentPart >= quotient) {
            nextDigit = (dividentPart / quotient) | 0;
            resultDigits.push(nextDigit);
            dividentPart = dividentPart - nextDigit * quotient;
        } else if (resultDigits.length) {
            resultDigits.push(0);
        }
        i++;
    } while (i < digits.length);
    return { a: resultDigits.join(""), b: dividentPart };
}

function decimalToHex(input) {
    var result = "", div;
    do {
        div = longDivision(input, 16);
        result = div.b.toString(16) + result;
        input = div.a;
    } while (input);
    if (!result) result = "0";
    return "0x" + result;
}

decimalToHex(source);
// '0x16ae5514d07e120126dfbcb3073fddb2b8c'