Como você converte valores decimais em seus equivalentes hexadecimais em JavaScript?
javascript
hex
tostring
base
number-formatting
Luke Smith
fonte
fonte
Respostas:
Converta um número em uma sequência hexadecimal com:
E inverta o processo com:
fonte
yourNumber
é uma variável. Se você quiser usar um literal numérico, precisará fazer algo como(45).toString(16)
, mas se estiver codificando um número, escreva-o como uma sequência hexadecimal ...(45).toString(16)
sempre será igual'2d'
, portanto, não desperdice a CPU ciclos para descobrir isso.42..toString(16)
Se você precisar lidar com coisas como campos de bits ou cores de 32 bits, precisará lidar com números assinados. A função JavaScript
toString(16)
retornará um número hexadecimal negativo que geralmente não é o que você deseja. Esta função faz alguma adição maluca para torná-la um número positivo.fonte
number = 0x100000000 + number;
>>>
operador para converter o número em representação não assinada, por exemplo,((-3253) >>> 0).toString(16)
retornos"fffff34b"
.+1
para uma adição útil, mas se você estiver convertendo números para uma notação diferente, todos os números já são "geralmente" positivos, ou você deseja resultados negativos.O código abaixo converterá o valor decimal d em hexadecimal. Também permite adicionar preenchimento ao resultado hexadecimal. Portanto, 0 se tornará 00 por padrão.
fonte
fonte
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, se você deseja a representação hexadecimal de dois números complementares de um número negativo, pode usar o operador de deslocamento com zero e preenchimento à direita
>>>
. Por exemplo:No entanto, há uma limitação: os operadores bit a bit do JavaScript tratam seus operandos como uma sequência de 32 bits , ou seja, você obtém o complemento de dois bits de 32 bits.
fonte
C# number to hexadecimal
estava produzindo resultados diferentes paraJavascript number to hexadecimal
. Parece que o Javascript está com problemas com números negativos. Esta resposta parece ser a solução para o problema.((-2)>>>0).toString(16).substring(2)
Com estofamento:
fonte
Sem o loop:
Também não é melhor não usar testes de loop que precisam ser avaliados?
Por exemplo, em vez de:
ter
fonte
Combinando algumas dessas boas idéias para uma função de valor RGB para hexadecimal (adicione o
#
restante em HTML / CSS):fonte
A resposta aceita não levou em consideração códigos hexadecimais retornados por um dígito. Isso é facilmente ajustado por:
e
Acredito que as respostas acima foram postadas várias vezes por outras pessoas, de uma forma ou de outra. Envolvo-os em uma função toHex () da seguinte forma:
Observe que a expressão regular numérica veio de mais de 10 funções úteis de expressão regular de JavaScript para melhorar a eficiência de seus aplicativos da web .
Atualização: Depois de testar isso várias vezes, encontrei um erro (aspas duplas no RegExp), então resolvi isso. CONTUDO! Depois de bastante teste e de ter lido o post por almaz - percebi que não conseguia obter números negativos para o trabalho.
Além disso - fiz algumas leituras sobre isso e, como todos os números JavaScript são armazenados como palavras de 64 bits, não importa o quê - tentei modificar o código numHex para obter a palavra de 64 bits. Mas acontece que você não pode fazer isso. Se você colocar "3.14159265" COMO NÚMERO em uma variável - tudo o que conseguirá obter é o "3", porque a parte fracionária só é acessível multiplicando o número por dez (IE: 10.0) repetidamente. Ou, colocando de outra maneira - o valor hexadecimal de 0xF faz com que o valor do ponto flutuante seja convertido em um número inteiro antes de ser ANDed, o que remove tudo o que está atrás do período. Em vez de pegar o valor como um todo (ou seja: 3,14159265) e ANDing do ponto flutuante valor do contra o valor 0xF.
Portanto, a melhor coisa a fazer, nesse caso, é converter o 3,14159265 em uma sequência e depois apenas converter a sequência. Por causa do exposto, também facilita a conversão de números negativos porque o sinal de menos se torna 0x26 na frente do valor.
Então, o que eu fiz foi determinar que a variável contém um número - basta convertê-lo em uma string e converter a string. Isso significa para todos que, no lado do servidor, você precisará unx da cadeia de caracteres recebida e, em seguida, determinar que as informações recebidas são numéricas. Você pode fazer isso facilmente adicionando um "#" na frente dos números e "A" na frente de uma sequência de caracteres retornando. Veja a função toHex ().
Diverta-se!
Depois de mais um ano e muito pensamento, decidi que a função "toHex" (e também tenho a função "fromHex") realmente precisava ser reformada. A questão toda era "Como posso fazer isso com mais eficiência?" Decidi que uma função hexadecimal de / para não deveria se importar se algo é uma parte fracionária, mas ao mesmo tempo deve garantir que partes fracionárias sejam incluídas na string.
Então a pergunta tornou-se: "Como você sabe que está trabalhando com uma cadeia hexadecimal?". A resposta é simples. Use as informações pré-string padrão que já são reconhecidas em todo o mundo.
Em outras palavras - use "0x". Então agora minha função toHex procura ver se ela já está lá e se está - apenas retorna a string que foi enviada a ela. Caso contrário, ele converte a string, número, qualquer que seja. Aqui está a função toHex revisada:
Essa é uma função muito rápida que leva em conta dígitos únicos, números de ponto flutuante e até verifica se a pessoa está enviando um valor hexadecimal para ser hexadecimal novamente. Ele usa apenas quatro chamadas de função e apenas duas delas estão no loop. Para cancelar a hex os valores que você usa:
Como a função toHex (), a função fromHex () primeiro procura o "0x" e depois converte as informações recebidas em uma sequência, se ainda não for uma sequência. Eu não sei como não seria uma corda - mas apenas no caso - eu verifico. A função então é executada, capturando dois caracteres e convertendo-os em caracteres ASCII. Se você quiser traduzir Unicode, precisará alterar o loop para passar por quatro (4) caracteres por vez. Mas também é necessário garantir que a sequência NÃO seja divisível por quatro. Se for - então é uma sequência hexadecimal padrão. (Lembre-se de que a string tem "0x" na frente.)
Um script de teste simples para mostrar que -3,14159265, quando convertido em uma sequência, ainda é -3,14159265.
Por causa de como o JavaScript funciona em relação à função toString (), todos esses problemas podem ser eliminados e que antes estavam causando problemas. Agora todas as seqüências e números podem ser convertidos facilmente. Além disso, coisas como objetos farão com que um erro seja gerado pelo próprio JavaScript. Eu acredito que isso é tão bom quanto ele ganha. A única melhoria que resta é que o W3C inclua apenas uma função toHex () e fromHex () no JavaScript.
fonte
if( s.substr(0,2)
antesif (typeof s != "string")
provavelmente não é o que você quer, por exemplo. O que eu havia retornado não era o que eu esperava (toHex(0x1f635)
dá"0x313238353635"
). Não investiguei mais.substr
&toLowerCase
em uma não-string ... então, étypeof
necessário que chegue mais cedo ou, se você esperavatoHex
lançar uma não-string ali, remova atypeof
verificação completamente. Faz sentido? Ou seja, se eu usasse o código aqui sem edições e telefonassetoHex(0x1f635)
, receberiaUncaught TypeError: s.substr is not a function
. Se eu mover a corda lançada mais cedo, você está certo, o número é convertido em decimal primeiro, talvez, e as coisas vão para o lado. O que, obviamente, significa que você não pode fazer uma conversão simples aqui ses
não for uma string.O 16 é a raiz e existem 16 valores em um número hexadecimal :-)
fonte
Para qualquer pessoa interessada, aqui está um JSFiddle comparando a maioria das respostas dadas a esta pergunta .
E aqui está o método que eu acabei usando:
Além disso, lembre-se de que, se você deseja converter de decimal para hexadecimal para uso em CSS como um tipo de dados em cores , pode preferir extrair os valores RGB do decimal e usar rgb () .
Por exemplo ( JSFiddle ):
Isso define
#some-element
acolor
propriedade CSS dergb(64, 62, 154)
.fonte
Restringido / preenchido para um número definido de caracteres:
fonte
Aqui está uma versão reduzida do ECMAScript 6:
fonte
fonte
color: rgb(r,g,b)
onde rg e b são números decimais.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 }
Se você deseja converter um número em uma representação hexadecimal de um valor de cor RGBA, achei a combinação mais útil de várias dicas daqui:
fonte
O comentário AFAIK 57807 está errado e deve ser algo como: var hex = Number (d) .toString (16); em vez de var hex = parseInt (d, 16);
fonte
E se o número for negativo?
Aqui está a minha versão.
fonte
Estou fazendo a conversão para string hexadecimal em um loop bastante grande, então tentei várias técnicas para encontrar a mais rápida. Meus requisitos eram ter uma sequência de comprimento fixo como resultado e codificar valores negativos corretamente (-1 => ff..f).
Simples
.toString(16)
não funcionou para mim, pois eu precisava que valores negativos fossem codificados corretamente. O código a seguir é o mais rápido que testei até agora em valores de 1-2 bytes (observe quesymbols
define o número de símbolos de saída que você deseja obter, ou seja, para um número inteiro de 4 bytes, deve ser igual a 8):Ele executa mais rápido que
.toString(16)
em números de 1-2 bytes e mais lento em números maiores (quandosymbols
> = 6), mas ainda deve superar os métodos que codificam valores negativos corretamente.fonte
Como declara a resposta aceita, a maneira mais fácil de converter de decimal para hexadecimal é
var hex = dec.toString(16)
. No entanto, você pode preferir adicionar uma conversão de string, pois garante que as representações de string"12".toString(16)
funcionem corretamente.Para reverter o processo, você também pode usar a solução abaixo, pois ela é ainda mais curta.
Parece ser mais lento no Google Chrome e Firefox, mas é significativamente mais rápido no Opera. Consulte http://jsperf.com/hex-to-dec .
fonte
Como converter decimal em hexadecimal em JavaScript
Não consegui encontrar uma conversão brutalmente limpa / decimal em hexadecimal que não envolvesse uma bagunça de funções e matrizes ... então tive que fazer isso por mim mesma.
fonte
Para resumir tudo;
No entanto, se você não precisar convertê-lo novamente em um número inteiro no final (por exemplo, para cores), basta garantir que os valores não sejam negativos.
fonte
Não encontrei uma resposta clara, sem verificações se é negativa ou positiva, que usa o complemento de dois (números negativos incluídos). Para isso, mostro minha solução para um byte:
Você pode usar esta instrução para qualquer número de bytes, apenas você adiciona
FF
nos respectivos lugares. Por exemplo, para dois bytes:Se você deseja converter um número inteiro da matriz na cadeia hexadecimal:
fonte
Caso pretenda converter em uma representação JavaScript ou CSS 'completa', você pode usar algo como:
fonte
Você pode fazer algo assim no ECMAScript 6 :
fonte
Se você estiver procurando pela conversão de números inteiros grandes, ou seja, números maiores que Number.MAX_SAFE_INTEGER - 9007199254740991, use o seguinte código
fonte
Isso é baseado nas soluções da Prestaul e Tod. No entanto, essa é uma generalização que explica o tamanho variável de uma variável (por exemplo, Analisando o valor assinado de um log serial do microcontrolador).
Script de teste:
Resultado dos testes:
Nota: Não sei ao certo por que falha acima de 32 bits
fonte
Aqui está a minha solução:
A pergunta diz: "Como converter decimal em hexadecimal em JavaScript" . Embora a pergunta não especifique que a cadeia hexadecimal comece com um prefixo 0x, qualquer pessoa que escreva código deve saber que 0x é adicionado aos códigos hexadecimais para distinguir códigos hexadecimais de identificadores programáticos e outros números (1234 pode ser hexadecimal, decimal ou até octal).
Portanto, para responder corretamente a essa pergunta, para fins de escrita de script, você deve adicionar o prefixo 0x.
A função Math.abs (N) converte negativos em positivos e, como bônus, não parece que alguém a executou através de um triturador de madeira.
A resposta que eu queria, teria um especificador de largura de campo, para que pudéssemos, por exemplo, mostrar valores de 8/16 / 32/64 bits da maneira que você os veria listados em um aplicativo de edição hexadecimal. Essa é a resposta correta e real.
fonte
Number('0xFF') === 255;
para todos vocês que desejam a operação reversa.