1

我试图取一个字符串,把它变成一个数字,把那个数字变成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填写。我知道这是一个更大的数字。

4

2 回答 2

3

Number as IEEE-754 double-precision floating-point 不具有精确表示您的值的精度;但是,大约接近。

BigInteger实现,例如as3crypto,以及其他支持任意长度的实现。

检查 as3crypto 的 BigIntegertoRadix()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));
于 2013-04-06T03:04:25.170 回答
1

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

下面的代码是用 JavaScript 编写的(对不起,我在这台机器上没有 AS 编译器),但是通过添加正确的类型标签让它看起来更像 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'
于 2013-04-06T11:48:27.103 回答