Как преобразовать очень большое шестнадцатеричное число в десятичное в JavaScript
Я пытаюсь без особого успеха преобразовать очень большое шестнадцатеричное число в десятичное. Моя проблема заключается в том, что использование deciaml = parseInt(hex, 16) дает мне ошибки в числе, когда я пытаюсь преобразовать шестнадцатеричное число выше 14 цифр.
У меня нет проблем с этим в Java, но Javascript, кажется, не точен выше 14 цифр шестнадцатеричного числа.
Я пробовал "BigNumber", но это дает мне тот же ошибочный результат.
Я использовал свои возможности в Интернете и нашел сайты, которые будут выполнять конвертацию, но не могут понять, как сделать конверсию.
Я попытался получить каждый символ по очереди и умножить его на его коэффициент, то есть 123456789abcdef 15 * Math.pow(16, 0) + 14 * Math.pow(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>
Спасибо.
Павел
6 ответов
Хорошо, давайте попробуем это:
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
что правильно (не стесняйтесь проверить).
Новый и легкий путь
var hex = "7FDDDDDDDDDDDDDDDDDDDDDD";
if (hex.length % 2) { hex = '0' + hex; }
var bn = BigInt('0x' + hex);
var d = bn.toString(10);
BigInt
s теперь доступны как в node.js, так и в Chrome. Firefox не должен быть далеко позади.
Если вам нужно иметь дело с отрицательными числами, это требует немного работы:
По существу:
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;
}
Обратите внимание, что "0x" + "ff" будет считаться 255, поэтому преобразуйте свое шестнадцатеричное значение в строку и добавьте "0x" вперед.
function Hex2decimal(hex)
{
return ("0x" + hex) / 1;
}
Если вы используете нотацию "0x" для своей шестнадцатеричной строки, не забудьте добавить s = s.slice(2)
удалить префикс "0x".
Конструктор BigInt может принимать шестнадцатеричную строку в качестве аргумента:
/** @param hex = "a83b01cd..." */
function Hex2decimal(hex) {
return BigInt("0x" + hex).toString(10);
}
Использование:
Hex2decimal("100");
Выход:
256
Грабеж из другого ответа , но без бессмысленного заполнения 0 = P
Помните, что JavaScript имеет только один числовой тип (double) и не предоставляет никаких отдельных целочисленных типов. Поэтому он может не иметь возможности хранить точные представления ваших чисел.
Чтобы получить точные результаты, вам нужно использовать библиотеку для целых чисел произвольной точности, такую как BigInt.js. Например, код:
var x = str2bigInt("5061756c205768697465",16,1,1);
var s = bigInt2str(x, 10);
$('#output').text(s);
Правильно конвертирует 0x5061756c205768697465
к ожидаемому результату 379587113978081151906917
,
Вот jsfiddle, если вы хотите поэкспериментировать с кодом, перечисленным выше.