Javascript - 十六进制字符串到十进制字符串
Posted
技术标签:
【中文标题】Javascript - 十六进制字符串到十进制字符串【英文标题】:Javascript - hexadecimal string to decimal string 【发布时间】:2014-03-07 04:53:51 【问题描述】:这个问题比最初看起来更复杂 - 尽管在概念上仍然相当简单。
我将超出javascript最大范围的大数字表示为十六进制数字的字符串(这与node-mysql的bigNumberStrings
选项的方法一致)。
我只是想知道如何将 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 - 十六进制字符串到十进制字符串的主要内容,如果未能解决你的问题,请参考以下文章