Как преобразовать десятичное в шестнадцатеричное в JavaScript - PullRequest
1314 голосов
/ 12 сентября 2008

Как преобразовать десятичные значения в их шестнадцатеричный эквивалент в JavaScript?

Ответы [ 27 ]

4 голосов
/ 13 декабря 2012

Я делаю преобразование в шестнадцатеричную строку в довольно большом цикле, поэтому я попробовал несколько методов, чтобы найти самый быстрый. В результате я должен был получить строку фиксированной длины и правильно кодировать отрицательные значения (-1 => ff..f).

Простой .toString(16) у меня не сработал, так как мне нужно было правильно кодировать отрицательные значения. Следующий код является самым быстрым из всех, что я тестировал на 1-2 байтовых значениях (обратите внимание, что symbols определяет количество выходных символов, которые вы хотите получить, то есть для 4-байтового целого числа оно должно быть равно 8):

var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function getHexRepresentation(num, symbols) {
    var result = '';
    while (symbols--) {
        result = hex[num & 0xF] + result;
        num >>= 4;
    }
    return result;
}

Он работает быстрее, чем .toString(16) для 1-2-байтовых чисел, и медленнее для больших чисел (когда symbols> = 6), но все же должен превосходить методы, которые правильно кодируют отрицательные значения.

2 голосов
/ 10 декабря 2013

Подводя итог всему;

function toHex(i, pad) {

  if (typeof(pad) === 'undefined' || pad === null) {
    pad = 2;
  } 

  var strToParse = i.toString(16);

  while (strToParse.length < pad) {
    strToParse = "0" + strToParse;
  }

  var finalVal =  parseInt(strToParse, 16);

  if ( finalVal < 0 ) {
    finalVal = 0xFFFFFFFF + finalVal + 1;
  }

  return finalVal;
}

Однако, если вам не нужно преобразовывать его обратно в целое число в конце (то есть для цветов), то достаточно просто убедиться, что значения не отрицательные.

1 голос
/ 13 марта 2018

Если вы хотите преобразовать в «полное» представление JavaScript или CSS, вы можете использовать что-то вроде:

  numToHex = function(num) {
    var r=((0xff0000&num)>>16).toString(16),
        g=((0x00ff00&num)>>8).toString(16),
        b=(0x0000ff&num).toString(16);
    if (r.length==1) { r = '0'+r; }
    if (g.length==1) { g = '0'+g; }
    if (b.length==1) { b = '0'+b; }
    return '0x'+r+g+b;                 // ('#' instead of'0x' for CSS)
  };

  var dec = 5974678;
  console.log( numToHex(dec) );        // 0x5b2a96
1 голос
/ 05 ноября 2017

Я не нашел четкого ответа, без проверок, является ли он отрицательным или положительным, который использует дополнение до двух (включая отрицательные числа). Для этого я покажу свое решение на один байт:

((0xFF + number +1) & 0x0FF).toString(16);

Вы можете использовать эту инструкцию для любого количества байтов, только вы добавляете FF в соответствующих местах. Например, до двух байтов:

((0xFFFF + number +1) & 0x0FFFF).toString(16);

Если вы хотите привести массив целое к шестнадцатеричной строке:

s = "";
for(var i = 0; i < arrayNumber.length; ++i) {
    s += ((0xFF + arrayNumber[i] +1) & 0x0FF).toString(16);
}
0 голосов
/ 17 мая 2019

Если вы ищете преобразование больших целых чисел, то есть чисел, превышающих Number.MAX_SAFE_INTEGER - 9007199254740991, то вы можете использовать следующий код

const hugeNumber = "9007199254740991873839" // Make sure its in String
const hexOfHugeNumber = BigInt(hugeNumber).toString(16);
console.log(hexOfHugeNumber)
0 голосов
/ 30 января 2019

Вы можете сделать что-то подобное в ECMAScript 6 :

const toHex = num => (num).toString(16).toUpperCase();
0 голосов
/ 20 ноября 2018

Вот мое решение:

hex = function(number) {
  return '0x' + Math.abs(number).toString(16);
}

В вопросе говорится: "Как преобразовать десятичное число в шестнадцатеричное в JavaScript" . Хотя в вопросе не указано, что шестнадцатеричная строка должна начинаться с префикса 0x, любой, кто пишет код, должен знать, что 0x добавляется к шестнадцатеричным кодам, чтобы отличать шестнадцатеричные коды от программные идентификаторы и другие числа (1234 может быть шестнадцатеричным, десятичным или даже восьмеричным).

Поэтому, чтобы правильно ответить на этот вопрос, для написания сценариев необходимо добавить префикс 0x.

Функция Math.abs (N) конвертирует негативы в позитивы, и в качестве бонуса не похоже, чтобы кто-то пробежал через дровосек.

Ответ, который я хотел получить, имел бы спецификатор ширины поля, поэтому мы могли бы, например, отображать 8/16/32/64-битные значения так, как вы бы их отображали в шестнадцатеричном приложении для редактирования. Это фактический, правильный ответ.

...