2014-02-10 3 views
1

Этот вопрос сложнее, чем в первый раз - хотя и концептуально довольно простой.Javascript - шестнадцатеричная строка до десятичной строки

Я представляю большие номера, которые находятся за пределами максимального диапазона JavaScript, поскольку строки шестнадцатеричных цифр (это в соответствии с подходом bigNumberStrings опции NODE-MySQL,).

Я просто хочу знать, как я могу преобразовать строку шестнадцатеричных цифр в строку десятичных цифр одного и того же числового значения? Очевидно, что в этом есть сложность, возникающая из-за того, что вы не можете делать математику с javascript с большими числами.

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

+0

Есть куча [BigInteger Libraries for JS] (http://www.joseprio.com/blog/2013/04/27/biginteger-libraries-for-js/). – RobG

ответ

1

Сам алгоритм не является достаточно простым, поэтому нет необходимости для специальной библиотеки, на самом деле это делает что бы вы делали на бумаге, поэтому она не слишком неэффективна.

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(''); 
} 

Как это работает: в основном читает шестнадцатеричные цифры и добавляет их в промежуточный массив со значения разла рассчитанного до сих пор. Каждая новая шестнадцатеричная цифра означает, что массив десятичных цифр умножается на 16, а все переносы распределяются на разряды более высокого порядка. Цикл while это добавляет любые дополнительные переносы в качестве новых цифр в массиве. Последняя строка просто преобразует массив десятичных цифр в строку.

Обновление: Конечно, вы можете сделать алгоритм более эффективным, заменив номер 10 везде любой другой мощностью 10 (100, 1000, 10000, 100000, ...), и он будет работать одинаково. Единственное требование, чтобы промежуточные значения не превышали точность мантиссы (52 бит).

+0

это красиво –

1

Вы можете использовать стандартную библиотеку как bignumber.js

Javascript

var hex = 'ABCDEF1234567890', 
    bignumber = new BigNumber(hex, 16); 

console.log(bignumber.toString(10)); 

Выход

12379813812177893520 

На jsFiddle

Смежные вопросы