¿Cómo se convierten los valores decimales a su equivalente hexadecimal en JavaScript?
javascript
hex
tostring
base
number-formatting
Luke Smith
fuente
fuente
Respuestas:
Convierta un número en una cadena hexadecimal con:
Y revierta el proceso con:
fuente
yourNumber
es una variable. Si desea usar un literal numérico, entonces tendrá que hacer algo como(45).toString(16)
, pero si está codificando un número, escríbalo como una cadena hexadecimal ...(45).toString(16)
siempre será igual'2d'
, así que no desperdicie CPU ciclos para resolver eso.42..toString(16)
Si necesita manejar cosas como campos de bits o colores de 32 bits, debe tratar con números con signo. La función de JavaScript
toString(16)
devolverá un número hexadecimal negativo que generalmente no es lo que desea. Esta función hace una adición loca para que sea un número positivo.fuente
number = 0x100000000 + number;
>>>
operador para convertir el número a una representación sin signo, por ejemplo,((-3253) >>> 0).toString(16)
devoluciones"fffff34b"
.+1
para una adición útil, pero si está convirtiendo números a una notación diferente, todos los números ya son "generalmente" positivos, o si no desea resultados negativos.El siguiente código convertirá el valor decimal d en hexadecimal. También le permite agregar relleno al resultado hexadecimal. Entonces 0 se convertirá en 00 por defecto.
fuente
fuente
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
const hex = d => Number(d).toString(16).padStart(2, '0')
😁Para completar, si desea la representación hexadecimal del complemento a dos de un número negativo, puede usar el operador de desplazamiento de relleno cero a la derecha
>>>
. Por ejemplo:Sin embargo, hay una limitación: los operadores de bits de JavaScript tratan sus operandos como una secuencia de 32 bits , es decir, obtienes el complemento de dos de 32 bits.
fuente
C# number to hexadecimal
estaba produciendo resultados diferentes paraJavascript number to hexadecimal
. Parece que Javascript tiene el problema con los números negativos. Esta respuesta parece ser la solución al problema.((-2)>>>0).toString(16).substring(2)
Con acolchado:
fuente
Sin el bucle:
Además, ¿no es mejor no usar pruebas de bucle que deben evaluarse?
Por ejemplo, en lugar de:
tener
fuente
Combinando algunas de estas buenas ideas para una función de valor RGB a hexadecimal (agregue la
#
otra parte para HTML / CSS):fuente
La respuesta aceptada no tuvo en cuenta los códigos hexadecimales devueltos de un solo dígito. Esto se ajusta fácilmente mediante:
y
Creo que las respuestas anteriores han sido publicadas en numerosas ocasiones por otros de una forma u otra. Los envuelvo en una función toHex () así:
Tenga en cuenta que la expresión regular numérica proviene de más de 10 funciones útiles de expresión regular de JavaScript para mejorar la eficiencia de sus aplicaciones web .
Actualización: después de probar esto varias veces, encontré un error (comillas dobles en RegExp), así que lo solucioné. ¡SIN EMBARGO! Después de probar un poco y haber leído la publicación de almaz, me di cuenta de que no podía obtener números negativos para trabajar.
Además, leí un poco sobre esto y, dado que todos los números de JavaScript se almacenan como palabras de 64 bits, pase lo que pase, intenté modificar el código numHex para obtener la palabra de 64 bits. Pero resulta que no puedes hacer eso. Si coloca "3.14159265" COMO NÚMERO en una variable, todo lo que podrá obtener es el "3", porque la porción fraccional solo es accesible multiplicando el número por diez (IE: 10.0) repetidamente. O para decirlo de otra manera: el valor hexadecimal de 0xF hace que el valor de coma flotante se traduzca a un número entero antes de ser AND, lo que elimina todo lo que está detrás del punto. En lugar de tomar el valor como un todo (es decir: 3.14159265) y ANDing el punto flotante valor de contra el valor 0xF.
Entonces, lo mejor que puede hacer, en este caso, es convertir el 3.14159265 en una cadena y luego simplemente convertir la cadena. Debido a lo anterior, también facilita la conversión de números negativos porque el signo menos se convierte en 0x26 en el frente del valor.
Entonces, lo que hice fue determinar que la variable contiene un número, simplemente convertirlo en una cadena y convertir la cadena. Esto significa para todos que, en el lado del servidor, necesitará eliminar la cadena de entrada y luego determinar que la información entrante es numérica. Puede hacerlo fácilmente simplemente agregando un "#" al frente de los números y "A" al frente de una cadena de caracteres que regresa. Vea la función toHex ().
¡Que te diviertas!
Después de otro año y mucho pensar, decidí que la función "toHex" (y también tengo una función "fromHex") realmente necesitaba ser renovada. Toda la pregunta era "¿Cómo puedo hacer esto de manera más eficiente?" Decidí que una función hexadecimal to / from no debería importarle si algo es una parte fraccionaria, pero al mismo tiempo debería garantizar que las partes fraccionarias estén incluidas en la cadena.
Entonces la pregunta se convirtió en "¿Cómo sabes que estás trabajando con una cadena hexadecimal?". La respuesta es simple. Utilice la información estándar previa a la cadena que ya se reconoce en todo el mundo.
En otras palabras, use "0x". Entonces, mi función toHex mira para ver si eso ya está allí y si lo está, solo devuelve la cadena que se le envió. De lo contrario, convierte la cadena, el número, lo que sea. Aquí está la función toHex revisada:
Esta es una función muy rápida que tiene en cuenta dígitos individuales, números de coma flotante e incluso verifica si la persona está enviando un valor hexadecimal para que se vuelva a hechizar. Solo usa cuatro llamadas a funciones y solo dos de ellas están en el bucle. Para deshechar los valores que usa:
Al igual que la función toHex (), la función fromHex () primero busca el "0x" y luego traduce la información entrante en una cadena si aún no es una cadena. No sé cómo no sería una cadena, pero por las dudas, lo compruebo. Luego, la función se ejecuta, captura dos caracteres y los traduce a caracteres ASCII. Si desea que traduzca Unicode, deberá cambiar el bucle a cuatro (4) caracteres a la vez. Pero también debe asegurarse de que la cadena NO sea divisible por cuatro. Si es así, entonces es una cadena hexadecimal estándar. (Recuerde que la cadena tiene "0x" en la parte delantera).
Un script de prueba simple para mostrar que -3.14159265, cuando se convierte en una cadena, sigue siendo -3.14159265.
Debido a cómo funciona JavaScript con respecto a la función toString (), se pueden eliminar todos esos problemas que antes causaban problemas. Ahora todas las cadenas y números se pueden convertir fácilmente. Además, cosas como los objetos provocarán un error generado por el propio JavaScript. Creo que esto es tan bueno como parece. La única mejora que queda es que W3C solo incluya una función toHex () y fromHex () en JavaScript.
fuente
if( s.substr(0,2)
antesif (typeof s != "string")
probablemente no sea lo que quieres, por ejemplo. Lo que había devuelto tampoco era lo que esperaba (toHex(0x1f635)
da"0x313238353635"
). No he investigado más.substr
&toLowerCase
en una sin cadena ... por lo tantotypeof
, o bien debe llegar antes, o, si esperabatoHex
lanzar una sin cadena allí, debe eliminar eltypeof
cheque por completo. ¿Tener sentido? Es decir, si usara el código aquí sin ediciones y llamaratoHex(0x1f635)
, obtendríaUncaught TypeError: s.substr is not a function
. Si muevo la cadena emitida antes, tienes razón, el número se convierte al decimal primero, tal vez, y las cosas van de lado. Lo que, por supuesto, significa que no puedes hacer un simple lanzamiento aquí sis
no es una cadena.El 16 es la raíz y hay 16 valores en un número hexadecimal :-)
fuente
Para cualquier persona interesada, aquí hay un JSFiddle que compara la mayoría de las respuestas dadas a esta pregunta .
Y aquí está el método con el que terminé yendo:
Además, tenga en cuenta que si está buscando convertir de decimal a hexadecimal para usar en CSS como un tipo de datos de color , puede preferir extraer los valores RGB del decimal y usar rgb () .
Por ejemplo ( JSFiddle ):
Esto establece
#some-element
lacolor
propiedad CSS dergb(64, 62, 154)
.fuente
Restringido / rellenado a un número establecido de caracteres:
fuente
Aquí hay una versión recortada de ECMAScript 6:
fuente
fuente
color: rgb(r,g,b)
donde rg y b son números decimales.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 }
Si desea convertir un número a una representación hexadecimal de un valor de color RGBA, he encontrado que esta es la combinación más útil de varios consejos desde aquí:
fuente
El comentario AFAIK 57807 es incorrecto y debería ser algo así como: var hex = Number (d) .toString (16); en lugar de var hex = parseInt (d, 16);
fuente
¿Y si el número es negativo?
Aquí está mi versión.
fuente
Estoy haciendo la conversión a una cadena hexadecimal en un bucle bastante grande, así que probé varias técnicas para encontrar la más rápida. Mis requisitos eran tener una cadena de longitud fija como resultado y codificar los valores negativos correctamente (-1 => ff..f).
Simple
.toString(16)
no funcionó para mí, ya que necesitaba valores negativos para codificar correctamente. El siguiente código es el más rápido que he probado hasta ahora en valores de 1-2 bytes (tenga en cuenta quesymbols
define el número de símbolos de salida que desea obtener, es decir, para un entero de 4 bytes, debería ser igual a 8):Funciona más rápido que
.toString(16)
en números de 1-2 bytes y más lento en números más grandes (cuandosymbols
> = 6), pero aún así debe superar a los métodos que codifican los valores negativos correctamente.fuente
Como dice la respuesta aceptada, la forma más fácil de convertir de decimal a hexadecimal es
var hex = dec.toString(16)
. Sin embargo, es posible que prefiera agregar una conversión de cadena, ya que garantiza que las representaciones de cadena"12".toString(16)
funcionen correctamente.Para revertir el proceso, también puede usar la solución a continuación, ya que es aún más corta.
Parece ser más lento en Google Chrome y Firefox, pero es significativamente más rápido en Opera. Ver http://jsperf.com/hex-to-dec .
fuente
Cómo convertir decimal a hexadecimal en JavaScript
No pude encontrar una conversión de decimal a hexadecimal brutalmente limpia / simple que no involucrara un desorden de funciones y matrices ... así que tuve que hacer esto por mí mismo.
fuente
Para resumir todo esto;
Sin embargo, si no necesita convertirlo de nuevo a un número entero al final (es decir, para los colores), bastará con asegurarse de que los valores no sean negativos.
fuente
No he encontrado una respuesta clara, sin verificaciones si es negativa o positiva, que utiliza el complemento de dos (números negativos incluidos). Para eso, muestro mi solución a un byte:
Puede usar esta instrucción para cualquier número de bytes, solo que agrega
FF
en los lugares respectivos. Por ejemplo, a dos bytes:Si desea convertir un entero de matriz en una cadena hexadecimal:
fuente
En caso de que desee convertir a una representación 'completa' de JavaScript o CSS, puede usar algo como:
fuente
Puede hacer algo como esto en ECMAScript 6 :
fuente
Si está buscando convertir números enteros grandes, es decir, números mayores que Number.MAX_SAFE_INTEGER - 9007199254740991, puede usar el siguiente código
fuente
Esto se basa en las soluciones de Prestaul y Tod. Sin embargo, esta es una generalización que explica el tamaño variable de una variable (por ejemplo, analizar el valor firmado de un registro serie del microcontrolador).
Script de prueba:
Resultados de la prueba:
Nota: no estoy muy seguro de por qué falla por encima de 32 bits
fuente
Aquí está mi solución:
La pregunta dice: "Cómo convertir decimal a hexadecimal en JavaScript" . Mientras que la pregunta no especifica que la cadena hexadecimal debe comenzar con un prefijo 0x, cualquiera que escriba código debe saber que 0x se agrega a los códigos hexadecimales para distinguir los códigos hexadecimales de los identificadores programáticos y otros números (1234 podría ser hexadecimal, decimal o incluso octal).
Por lo tanto, para responder correctamente a esta pregunta, con el fin de escribir guiones, debe agregar el prefijo 0x.
La función Math.abs (N) convierte los negativos en positivos, y como beneficio adicional, no parece que alguien lo haya pasado por una astilladora.
La respuesta que quería, habría tenido un especificador de ancho de campo, por lo que podríamos, por ejemplo, mostrar valores de 8/16/32/64 bits de la forma en que los vería en una aplicación de edición hexadecimal. Esa es la respuesta correcta real.
fuente
Number('0xFF') === 255;
para todos los que quieren la operación inversa.