Как преобразовать десятичные значения в их шестнадцатеричный эквивалент в JavaScript?
javascript
hex
tostring
base
number-formatting
Люк Смит
источник
источник
Ответы:
Преобразуйте число в шестнадцатеричную строку с помощью:
И обратный процесс с:
источник
yourNumber
это переменная. Если вы хотите использовать числовой литерал, вам нужно будет сделать что-то вроде этого(45).toString(16)
, но если вы жестко кодируете число, просто напишите его в виде шестнадцатеричной строки ...(45).toString(16)
всегда будет равным'2d'
, так что не тратьте процессор циклы, чтобы понять это.42..toString(16)
Если вам нужно обрабатывать такие вещи, как битовые поля или 32-битные цвета, то вам нужно иметь дело со знаковыми числами. Функция JavaScript
toString(16)
будет возвращать отрицательное шестнадцатеричное число, которое обычно не то, что вы хотите. Эта функция делает какое-то безумное дополнение, чтобы сделать ее положительным числом.источник
number = 0x100000000 + number;
>>>
оператор для преобразования числа в беззнаковое представление, например,((-3253) >>> 0).toString(16)
возвращает"fffff34b"
.+1
для полезного дополнения, но если вы конвертируете числа в другую запись, все числа уже «обычно» положительны, иначе вы хотите получить отрицательные результаты.Приведенный ниже код преобразует десятичное значение d в шестнадцатеричное. Это также позволяет вам добавлять отступы к шестнадцатеричному результату. Таким образом, 0 станет 00 по умолчанию.
источник
источник
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
const hex = d => Number(d).toString(16).padStart(2, '0')
😁Для полноты, если вы хотите шестнадцатеричное представление отрицательного числа с дополнением до двух , вы можете использовать оператор сдвига нуля-заполнения-вправо
>>>
. Например:Однако есть одно ограничение: побитовые операторы JavaScript обрабатывают свои операнды как последовательность из 32 битов , то есть вы получаете 32-битное дополнение к двум.
источник
C# number to hexadecimal
дает разные результатыJavascript number to hexadecimal
. Похоже, у Javascript есть проблема с отрицательными числами. Этот ответ кажется решением проблемы.((-2)>>>0).toString(16).substring(2)
С прокладкой:
источник
Без цикла:
Также не лучше ли использовать циклические тесты, которые должны быть оценены?
Например, вместо:
иметь
источник
Объединение некоторых из этих хороших идей для шестнадцатеричной функции RGB-значения-значения (добавьте
#
другое место для HTML / CSS):источник
В принятом ответе не учитывались однозначные возвращаемые шестнадцатеричные коды. Это легко регулируется:
а также
Я полагаю, что вышеупомянутые ответы были отправлены много раз другими в той или иной форме. Я обертываю их в функцию toHex () следующим образом:
Обратите внимание, что числовое регулярное выражение было получено из 10+ полезных функций регулярных выражений JavaScript для повышения эффективности ваших веб-приложений. .
Обновление: после тестирования этой вещи несколько раз я обнаружил ошибку (двойные кавычки в RegExp), поэтому я исправил это. ОДНАКО! После небольшого тестирования и прочтения сообщения almaz - я понял, что не могу заставить работать отрицательные числа.
Далее - я немного прочитал об этом, и поскольку все числа JavaScript хранятся как 64-битные слова, несмотря ни на что - я попытался изменить код numHex, чтобы получить 64-битное слово. Но, оказывается, ты не можешь этого сделать. Если вы поместите «3.14159265» КАК НОМЕР в переменную - все, что вы сможете получить, это «3», потому что дробная часть доступна только путем повторного умножения числа на десять (IE: 10.0). Или, другими словами, шестнадцатеричное значение 0xF приводит к тому, что значение с плавающей запятой переводится в целое число, прежде чем оно будет равно ANDed, которое удаляет все, что находится за периодом. Вместо того, чтобы принимать значение в целом (то есть: 3.14159265) и сравнивать значение с плавающей запятой со значением 0xF.
Поэтому в данном случае лучше всего преобразовать 3.14159265 в строку а затем просто преобразовать строку. Из-за вышеизложенного также легко конвертировать отрицательные числа, потому что знак минус становится 0x26 на передней части значения.
Итак, я решил определить, что переменная содержит число - просто преобразовать его в строку и преобразовать строку. Это значит для всех, что на стороне сервера вам нужно будет отсоединить входящую строку, а затем определить, что входящая информация является числовой. Вы можете сделать это легко, просто добавив "#" в начале чисел и "A" в начале строки символов, возвращающейся. Смотрите функцию toHex ().
Радоваться, веселиться!
После еще одного года и долгих раздумий я решил, что функцию "toHex" (а также функцию "fromHex") действительно необходимо обновить. Весь вопрос был «Как я могу сделать это более эффективно?» Я решил, что шестнадцатеричная функция to / from не должна заботиться о том, является ли что-то дробной частью, но в то же время она должна гарантировать, что дробные части включены в строку.
И тогда возник вопрос: «Как вы узнаете, что работаете с шестнадцатеричной строкой?». Ответ прост. Используйте стандартную предстроковую информацию, которая уже признана во всем мире.
Другими словами - используйте «0x». Так что теперь моя функция toHex проверяет, есть ли она там и есть ли она - она просто возвращает строку, которая была ему отправлена. В противном случае он преобразует строку, число, что угодно. Вот пересмотренная функция toHex:
Это очень быстрая функция, которая учитывает однозначные числа, числа с плавающей запятой и даже проверяет, отправляет ли человек шестнадцатеричное значение для повторного зашифрования. Он использует только четыре вызова функций, и только два из них находятся в цикле. Чтобы снять шестнадцатеричные значения, которые вы используете:
Как и функция toHex (), функция fromHex () сначала ищет «0x», а затем преобразует входящую информацию в строку, если она еще не является строкой. Я не знаю, как это будет не строка - но на всякий случай - я проверяю. Затем функция проходит, захватывая два символа и переводя их в символы ASCII. Если вы хотите, чтобы он переводил Unicode, вам нужно будет изменить цикл на четыре (4) символа за раз. Но тогда вам также нужно убедиться, что строка НЕ делится на четыре. Если это так - тогда это стандартная шестнадцатеричная строка. (Помните, что строка имеет «0x» на передней части.)
Простой тестовый скрипт, показывающий, что -3.14159265 при преобразовании в строку все равно -3.14159265.
Из-за того, как JavaScript работает в отношении функции toString (), можно устранить все эти проблемы, которые раньше вызывали проблемы. Теперь все строки и числа могут быть легко преобразованы. Кроме того, такие вещи, как объекты, будут вызывать ошибку, генерируемую самим JavaScript. Я считаю, что это почти так же хорошо, как и получается. Единственное оставшееся улучшение для W3C - просто включить в JavaScript функции toHex () и fromHex ().
источник
if( s.substr(0,2)
раньше,if (typeof s != "string")
наверное, не то, что вы хотите. То, что я вернул, тоже не то, что я ожидал (toHex(0x1f635)
дает"0x313238353635"
). Не исследовал дальше.substr
&toLowerCase
для не-строки ... так что либоtypeof
нужно прийти раньше, либо, если вы ожидаетеtoHex
бросить не-строку прямо здесь, вы должны полностью удалитьtypeof
проверку. Есть смысл? То есть, если бы я использовал здесь код без правок и позвонилtoHex(0x1f635)
, я бы получилUncaught TypeError: s.substr is not a function
. Если я перенесу приведенную ранее строку, то вы правы, возможно, число сначала преобразуется в десятичную, и все идет вбок. Что, конечно, означает, что вы не можете выполнять простое приведение здесь, еслиs
это не строка.16 - это основа, и в шестнадцатеричном числе есть 16 значений :-)
источник
Для тех, кто заинтересован, вот JSFiddle, сравнивающий большинство ответов на этот вопрос .
И вот метод, с которым я в конечном итоге пошел:
Кроме того, имейте в виду, что если вы хотите преобразовать десятичное число в шестнадцатеричное для использования в CSS в качестве цветного типа данных , вы можете вместо этого извлечь значения RGB из десятичного числа и использовать rgb () .
Например ( JSFiddle ):
Это устанавливает свойство
#some-element
CSScolor
вrgb(64, 62, 154)
.источник
Ограничено / дополнено заданным количеством символов:
источник
Вот урезанная версия ECMAScript 6:
источник
источник
color: rgb(r,g,b)
где rg и b - десятичные числа.function decimalToHexString(i) { var result = "00"; if (i >= 0 && i <= 15) { result += "000" + i.toString(16); } else if (i >= 16 && i <= 255) { result += "00" + i.toString(16); } else if (i >= 256 && i <= 4095) { result += "0" + i.toString(16); } else if (i >= 4096 && i <= 65535) { result += i.toString(16); } return result }
Если вы хотите преобразовать число в шестнадцатеричное представление значения цвета RGBA, я считаю, что это наиболее полезная комбинация из нескольких советов:
источник
AFAIK комментарий 57807 не так и должно быть что - то вроде: вар гекс = Number (d) .ToString (16); вместо var hex = parseInt (d, 16);
источник
А если число отрицательное?
Вот моя версия.
источник
Я делаю преобразование в шестнадцатеричную строку в довольно большом цикле, поэтому я попробовал несколько методов, чтобы найти самый быстрый. Моими требованиями было получить строку фиксированной длины и правильно кодировать отрицательные значения (-1 => ff..f).
Простой
.toString(16)
не работал для меня, так как мне нужно было, чтобы отрицательные значения были правильно закодированы. Следующий код является самым быстрым из всех, что я тестировал на 1-2 байтовых значениях (обратите внимание, чтоsymbols
определяет количество выходных символов, которые вы хотите получить, то есть для 4-байтового целого числа оно должно быть равно 8):Он работает быстрее, чем
.toString(16)
на 1-2 байтовых числах, и медленнее на больших числах (когдаsymbols
> = 6), но все же должен превосходить методы, которые правильно кодируют отрицательные значения.источник
Как говорится в принятом ответе, самый простой способ преобразования из десятичного в шестнадцатеричное - это
var hex = dec.toString(16)
. Однако вы можете предпочесть добавить преобразование строк, так как оно гарантирует, что строковые представления вроде"12".toString(16)
работают правильно.Чтобы отменить процесс, вы также можете использовать приведенное ниже решение, так как оно еще короче.
Кажется, он медленнее в Google Chrome и Firefox, но значительно быстрее в Opera. Смотрите http://jsperf.com/hex-to-dec .
источник
Как преобразовать десятичное в шестнадцатеричное в JavaScript
Я не смог найти абсолютно чистого / простого преобразования десятичного числа в шестнадцатеричное, в котором не было бы путаницы функций и массивов ... поэтому мне пришлось сделать это для себя.
источник
Подводя итог всему этому;
Однако, если вам не нужно преобразовывать его обратно в целое число в конце (то есть для цветов), то достаточно просто убедиться, что значения не отрицательные.
источник
Я не нашел четкого ответа, без проверок, является ли он отрицательным или положительным, который использует два дополнения (включая отрицательные числа). Для этого я покажу свое решение на один байт:
Вы можете использовать эту инструкцию для любого количества байтов, только вы добавляете
FF
в соответствующих местах. Например, до двух байтов:Если вы хотите привести массив целое к шестнадцатеричной строке:
источник
Если вы хотите преобразовать в «полное» представление JavaScript или CSS, вы можете использовать что-то вроде:
источник
Вы можете сделать что-то подобное в ECMAScript 6 :
источник
Если вы хотите преобразовать большие целые числа, то есть числа больше чем Number.MAX_SAFE_INTEGER - 9007199254740991, то вы можете использовать следующий код
источник
Это основано на решениях Prestaul и Tod. Тем не менее, это обобщение, которое учитывает переменный размер переменной (например, анализ значения со знаком из последовательного журнала микроконтроллера).
Тестовый скрипт:
Результаты теста:
Примечание: не слишком уверен, почему он терпит неудачу выше 32 бит
источник
Вот мое решение:
Вопрос говорит: «Как преобразовать десятичное в шестнадцатеричное в JavaScript» . Хотя в вопросе не указано, что шестнадцатеричная строка должна начинаться с префикса 0x, любой, кто пишет код, должен знать, что 0x добавляется к шестнадцатеричным кодам, чтобы отличать шестнадцатеричные коды от программных идентификаторов и других чисел. (1234 может быть шестнадцатеричным, десятичным или четное восьмеричное).
Поэтому, чтобы правильно ответить на этот вопрос, для написания сценариев необходимо добавить префикс 0x.
Функция Math.abs (N) конвертирует негативы в позитивы, и в качестве бонуса не похоже, чтобы кто-то пробежал через дровосек.
Ответ, который я хотел получить, имел бы спецификатор ширины поля, так что мы могли бы, например, отображать 8/16/32/64-битные значения так, как вы их видите в шестнадцатеричном приложении для редактирования. Это фактический, правильный ответ.
источник
Number('0xFF') === 255;
для всех вас, кто хочет обратную операцию.