Javascript - 十六进制字符串到十进制字符串

Jos*_*ick 5 javascript string hex decimal

这个问题比乍看起来更复杂——尽管在概念上仍然相当简单。

我将超出 javascript 最大范围的大数字表示为十六进制数字字符串(这与 node-mysqlbigNumberStrings选项的方法一致)。

我只是想知道如何将一串十六进制数字转换为一串相同数值的十进制数字?显然,这样做很复杂,因为您无法使用具有大量数字的 javascript 进行数学运算。

虽然我还没有找到一个标准解决方案,但我已经做了大量的搜索。

Xot*_*750 5

您可以使用像bignumber.js这样的标准库

JavaScript

var hex = 'ABCDEF1234567890',
    bignumber = new BigNumber(hex, 16);

console.log(bignumber.toString(10));
Run Code Online (Sandbox Code Playgroud)

输出

12379813812177893520 
Run Code Online (Sandbox Code Playgroud)

关于jsFiddle


jJ'*_*jJ' 4

该算法本身非常简单,因此不需要特殊的库,它实际上可以完成您在纸上所做的事情,因此效率并不算太低。

function hexToDec(s) {
    var i, j, digits = [0], carry;
    for (i = 0; i < s.length; i += 1) {
        carry = parseInt(s.charAt(i), 16);
        for (j = 0; j < digits.length; j += 1) {
            digits[j] = digits[j] * 16 + carry;
            carry = digits[j] / 10 | 0;
            digits[j] %= 10;
        }
        while (carry > 0) {
            digits.push(carry % 10);
            carry = carry / 10 | 0;
        }
    }
    return digits.reverse().join('');
}
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:基本上读取十六进制数字并将它们添加到到目前为止计算的十进制值的中间数组中。每个新的十六进制数字意味着十进制数字数组乘以 16,并且所有结转都分配给更高阶的数字。while 循环它以添加任何额外的结转作为数组中的新数字。最后一行只是将十进制数字数组转换为字符串。

更新:当然,您可以通过将数字 10 处处替换为 10 的任何其他幂(100、1000、10000、100000...)来提高算法的效率,并且算法的工作原理相同。唯一的要求是中间值不超过尾数精度(52 位)。