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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

有一堆BigInteger Libraries for JS。 这能回答你的问题吗? How to convert a very large hex number to decimal in javascript 【参考方案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;

【讨论】:

以上是关于Javascript - 十六进制字符串到十进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

怎样将十六进制代码转换成文字?

Int到javascript中的十六进制字符串[重复]

Javascript:Unicode字符串到十六进制

对比字节流和字符流,回答为什么FileReader不能用来拷贝图片

如何编译nodejs的二进制模块

XLSX 客户端从后端 api 响应中保存:二进制字符串、应用程序/八位字节流