Как преобразовать очень большое шестнадцатеричное число в десятичное в 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);

BigInts теперь доступны как в 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, если вы хотите поэкспериментировать с кодом, перечисленным выше.

Другие вопросы по тегам