Как преобразовать очень большое шестнадцатеричное число в десятичное в javascript

Я пытаюсь без особого успеха преобразовать очень большое шестнадцатеричное число в десятичное. Моя проблема в том, что использование deciaml = parseInt(hex, 16) дает мне ошибки в числе, когда я пытаюсь преобразовать шестнадцатеричное число выше 14 цифр.

У меня нет проблем с этим на Java, но Javascript не кажется точным выше 14 цифр hex.

Я пробовал "BigNumber", но это дает мне тот же ошибочный результат.

Я тралил сеть в лучшем из моих возможность и найденные веб-сайты, которые будут делать преобразование, но не могут понять, как сделать преобразование longhand.

Я попытался получить каждый символ по очереди и умножить его на его коэффициент, т. е. 123456789abcdef 15 * математика.pow (16, 0) + 14 * математика.Поу (16, 1).... и т. д. Но я думаю (будучи noob), что мои подпрограммы могут быть не такими, какими они должны быть, потому что я получил полностью (и я имею в виду действительно разные!) ответ.

Если это поможет вам, ребята, я могу опубликовать то, что я написал пока для вас, чтобы посмотреть, но я надеюсь, что у кого-то есть простой ответ для меня.

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

спасибо.

Павел

4 ответов


Хорошо, давайте попробуем это:

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

имейте в виду, что JavaScript имеет только один числовой тип (double) и не предоставляет никаких отдельных целочисленных типов. Таким образом, может быть невозможно сохранить точные представления ваших чисел.

чтобы получить точные результаты, вам нужно использовать библиотеку для целых чисел произвольной точности, таких как тип bigint.js. Например, код:

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

правильно преобразует 0x5061756c205768697465 к ожидаемому результату 379587113978081151906917.

здесь является jsfiddle, если вы хотите поэкспериментировать с кодом, перечисленным выше.


Если вы используете обозначение " 0x " для своей шестнадцатеричной строки, Не забудьте добавить s = s.slice(2) чтобы удалить префикс' 0x'.