如何在javascript中将非常大的十六进制数转换为十进制数



我尝试将一个非常大的十六进制数转换为十进制,但没有成功。我的问题是使用decaml=parseInt(十六进制,16)当我尝试转换14位以上的十六进制数字时,会在数字中出现错误。

我在Java中对此没有问题,但Javascript在十六进制的14位以上似乎并不准确。

我试过"BigNumber",但它给了我同样错误的结果。

我已经尽我所能在网上搜索了一下,找到了可以进行转换的网站,但无法直接找到如何进行转换。

我试着依次获取每个字符,并将其乘以其因子,即123456789abdef15*数学.pow(16,0)+14*数学.poh(16,1)。。。。等等,但我认为(作为一个傻瓜)我的子程序可能没有达到应有的水平,因为我得到了一个完全不同的答案。

如果这对你们有帮助,我可以发布我到目前为止写的东西给你们看,但我希望有人能给我一个简单的答案

<script>
function Hex2decimal(hex){
var stringLength = hex.length;
var characterPosition = stringLength;
var character;
var hexChars = new Array();
hexChars[0] = "0";
hexChars[1] = "1";
hexChars[2] = "2";
hexChars[3] = "3";
hexChars[4] = "4";
hexChars[5] = "5";
hexChars[6] = "6";
hexChars[7] = "7";
hexChars[8] = "8";
hexChars[9] = "9";
hexChars[10] = "a";
hexChars[11] = "b";
hexChars[12] = "c";
hexChars[13] = "d";
hexChars[14] = "e";
hexChars[15] = "f";
var index = 0;
var hexChar;
var result;
//   document.writeln(hex);
while (characterPosition >= 0)
{
//   document.writeln(characterPosition);
character = hex.charAt(characterPosition);
while (index < hexChars.length)
{
//       document.writeln(index);
document.writeln("String Character = " + character);
hexChar = hexChars[index];
document.writeln("Hex Character = " + hexChar);
if (hexChar == character)
{
result = hexChar;
document.writeln(result);
}
index++
}
//   document.write(character);
characterPosition--;
}
return result;
}
</script>

谢谢。

Paul

新的简单方法

var hex = "7FDDDDDDDDDDDDDDDDDDDDDD";
if (hex.length % 2) { hex = '0' + hex; }
var bn = BigInt('0x' + hex);
var d = bn.toString(10);

BigInt现在在大多数浏览器中都可用(IE除外)。

在这个答案的前面:

  • BigInt现在可以在node.js和Chrome中使用。Firefox应该不会落后太多

如果你需要处理负数,那需要一些工作:

  • 如何处理签名JS BigInts

本质上:

function hexToBn(hex) {
if (hex.length % 2) {
hex = '0' + hex;
}
var highbyte = parseInt(hex.slice(0, 2), 16)
var bn = BigInt('0x' + hex);
if (0x80 & highbyte) {
// You'd think `bn = ~bn;` would work... but it doesn't
// manually perform two's compliment (flip bits, add one)
// (because JS binary operators are incorrect for negatives)
bn = BigInt('0b' + bn.toString(2).split('').map(function (i) {
return '0' === i ? 1 : 0
}).join('')) + BigInt(1);
bn = -bn;
}
return bn;
}

好的,让我们试试这个:

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;
}

测试:

t = 'dfae267ab6e87c62b10b476e0d70b06f8378802d21f34e7'
console.log(h2d(t)) 

打印

342789023478234789127089427304981273408912349586345899239

这是正确的(请随意验证)。

请注意,"0x"+"ff"将被视为255,因此将十六进制值转换为字符串,并在前面添加"0x"。

function Hex2decimal(hex)
{
return ("0x" + hex) / 1;
} 

如果您的十六进制字符串使用'0x'表示法,请不要忘记添加s = s.slice(2)以删除'0x'前缀。

请记住,JavaScript只有一个数字类型(double),不提供任何单独的整数类型。因此,它可能不可能存储你的数字的精确表示。

为了获得精确的结果,您需要使用任意精度整数的库,如BigInt.js

var x = str2bigInt("5061756c205768697465",16,1,1);
var s = bigInt2str(x, 10);
$('#output').text(s);

0x5061756c205768697465正确转换为379587113978081151906917的预期结果。

如果您想试用上面列出的代码,这里有一个jsfiddle。

BigInt构造函数可以采用十六进制字符串作为参数:

/** @param hex = "a83b01cd..." */
function Hex2decimal(hex) {
return BigInt("0x" + hex).toString(10);
}

用法:

Hex2decimal("100");

输出:

256

从另一个答案中剽窃,但没有无意义的0填充=p

最新更新