在Javascript中将大整数转换为十六进制字符串

16

我需要找到一种在JavaScript中将大数转换为十六进制字符串的方法。一开始,我尝试使用myBigNumber.toString(16),但如果myBigNumber的值非常大(例如1298925419114529174706173),那么myBigNumber.toString(16)将返回错误结果,这真是太棒了。我试着编写了自己的函数,如下所示:

function (integer) {
    var result = '';

    while (integer) {
        result = (integer % 16).toString(16) + result;
        integer = Math.floor(integer / 16);
    }
}

然而,模16的大量数字都返回0(我认为这是导致toString问题的根本原因。我还尝试用(integer - 16 * Math.floor(integer/16))代替(integer % 16),但问题仍然存在。

我也看过 Big Integer JavaScript 库,但那是一个庞大的插件,而我只希望解决一个相对简单的问题。

有什么想法可以让我得到有效的结果吗?也许采用某种分治方法?我真的很困惑。


1
这是一个关于大数字的问题,不将其转换为字符串 1298925419114529174706173 === 1298925419114529174706170 - Paul S.
你的数字远超过了JavaScript最大的整数,请参考https://dev59.com/hnVC5IYBdhLWcg3wZwNT。 - bfavaretto
2
好吧,这没有什么乐趣。如果我有一个数字的十进制字符串表示,有没有一种简单的方法将其转换为十六进制字符串? - Joshua Bambrick
我找到了http://danvk.org/hex2dec.html,它提供了一种非常直接的方法来实现这一点。感谢您的帮助。 - Joshua Bambrick
3个回答

14
假设您将整数存储为十进制字符串,例如'1298925419114529174706173'
function dec2hex(str){ // .toString(16) only works up to 2^53
    var dec = str.toString().split(''), sum = [], hex = [], i, s
    while(dec.length){
        s = 1 * dec.shift()
        for(i = 0; s || i < sum.length; i++){
            s += (sum[i] || 0) * 10
            sum[i] = s % 16
            s = (s - sum[i]) / 16
        }
    }
    while(sum.length){
        hex.push(sum.pop().toString(16))
    }
    return hex.join('')
}

4

所涉及的数字超过了JavaScript的最大整数。但是,您可以通过字符串来处理这样的大数字,并且有一些插件可以帮助您完成此操作。在这种情况下特别有用的一个示例是hex2dec插件。


2

我采用的方法是使用 bignumber.js 库,并创建一个以字符串形式传递值的 BigNumber,然后只需使用 toString 转换为十六进制:

  const BigNumber = require('bignumber.js');
  const lrgIntStr = '1298925419114529174706173';
  const bn = new BigNumber(lrgIntStr);
  const hex = bn.toString(16);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接