【问题标题】:Javascript - hexadecimal string to decimal stringJavascript - 十六进制字符串到十进制字符串
【发布时间】:2014-03-07 04:53:51
【问题描述】:

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

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

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

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

【问题讨论】:

标签: javascript string hex decimal


【解决方案1】:

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

Javascript

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

console.log(bignumber.toString(10));

输出

12379813812177893520 

开启jsFiddle

【讨论】:

  • 尝试用这个库转换'08d948645b86ee3f',它给出了637620418119134783,当你尝试用c#转换它时,你得到637592770119134783为什么它们不一样?
【解决方案2】:

算法本身很简单,所以不需要专门的库,它实际上做了你在纸上会做的事情,所以效率不会太低。

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

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

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

【讨论】:

    【解决方案3】:

    这个帖子中的其他答案对我不起作用,但this one 做到了:

    function h2d(s) {
    
        function add(x, y) {
            var c = 0, r = [];
            var x = x.split('').map(Number);
            var y = y.split('').map(Number);
            while(x.length || y.length) {
                var s = (x.pop() || 0) + (y.pop() || 0) + c;
                r.unshift(s < 10 ? s : s - 10); 
                c = s < 10 ? 0 : 1;
            }
            if(c) r.unshift(c);
            return r.join('');
        }
    
        var dec = '0';
        s.split('').forEach(function(chr) {
            var n = parseInt(chr, 16);
            for(var t = 8; t; t >>= 1) {
                dec = add(dec, dec);
                if(n & t) dec = add(dec, '1');
            }
        });
        return dec;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多