Come convertire i decimali in esadecimali in JavaScript


1479

Come si convertono i valori decimali nel loro equivalente esadecimale in JavaScript?


7
Solo un avvertimento qui è che stai partendo da una rappresentazione di stringa è molto facile perdere precisione quando lo trasformi in Numero come parte della conversione in esadecimale. Vedi danvk.org/wp/2012-01-20/… .
Studgeek

Questa funzione è esattamente ciò di cui hai bisogno
Mohammad Musavi il

Risposte:


2476

Converti un numero in una stringa esadecimale con:

hexString = yourNumber.toString(16);

E invertire il processo con:

yourNumber = parseInt(hexString, 16);

42
in questo caso tuoNum è una stringa esadecimale. Ad esempio (255) .toString (16) == 'ff' && parseInt ('ff', 16) == 255
Prestaul

8
@forste, non "perderai la precisione" se converti un numero javascript (che è un oggetto Number, che nello script ECMA è un doppio) in esadecimale e viceversa usando questa tecnica. La domanda che hai collegato fa riferimento in particolare a numeri troppo grandi per rientrare in un doppio (da cui la rappresentazione di stringa nella domanda). Se hai un numero, questo funzionerà. Se hai qualcosa di troppo grande per essere un oggetto Numero javascript (un doppio), dovrai trovare qualcos'altro.
Prestaul,

12
@Derek, ho un problema psicologico che non mi permetterà di tollerare parentesi non necessarie ... @ tutti gli altri, yourNumberè una variabile. Se vuoi usare un valore letterale numerico, allora dovrai fare qualcosa del genere (45).toString(16), ma se stai codificando un numero in modo rigido, ti preghiamo di scriverlo come una stringa esadecimale ... (45).toString(16)sarà sempre uguale '2d', quindi non sprecare cpu cicli per capirlo.
Prestaul,

21
@Prestaul "Non sprecare cicli di CPU per capirlo" - si chiama ottimizzazione prematura. A meno che JavaScript non sia in esecuzione su un 286, dubito che le spese generali siano importanti. Inoltre, "45" potrebbe essere un numero magico che il programmatore deve essere in grado di riconoscere (come la durata del timeout in secondi), mentre "2d", chi lo riconoscerà?
Dejay Clayton,

47
Se non ti piacciono le parentesi, puoi semplicemente usare un punto in più:42..toString(16)
Thomas Watson

142

Se hai bisogno di gestire cose come campi di bit o colori a 32 bit, allora devi occuparti dei numeri con segno. La funzione JavaScript toString(16)restituirà un numero esadecimale negativo che di solito non è quello desiderato. Questa funzione fa qualche aggiunta folle per renderlo un numero positivo.

function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));


5
è quel complemento a due?
Giuliano

2
Questa conversione di solito non è necessaria in quanto JavaScript può rappresentare tutti i campi a 32 bit come numeri senza segno (vedere Number.MAX_SAFE_INTEGER). Per lo stesso motivo la conversione in unsigned può essere scritta come:number = 0x100000000 + number;
Johannes Matokic,

3
Una breve nota sul mio commento precedente: Mentre la rappresentazione esadecimale dovrebbe funzionare per numeri fino a Number.MAX_SAFE_INTEGER, ciò non vale per le operazioni bit a bit (che vengono spesso utilizzate per creare colori a 32 bit). Il risultato di operazioni bit a bit è sempre un numero intero a 32 bit con segno. Pertanto i risultati bit a bit> = 2 ^ 31 sono negativi e 0x100000000 | 0 === 0.
Johannes Matokic,

25
È possibile utilizzare l' >>>operatore per convertire il numero in rappresentazione non firmata, ad es . ((-3253) >>> 0).toString(16)Resi "fffff34b".
csharpfolk,

1
+1per un'aggiunta utile, ma se stai convertendo i numeri in una notazione diversa, tutti i numeri sono "normalmente" già positivi, oppure vuoi risultati negativi.
Carl Smith,

82

Il codice seguente converte il valore decimale d in esadecimale. Inoltre, consente di aggiungere il riempimento al risultato esadecimale. Quindi 0 diventerà 00 per impostazione predefinita.

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}

5
Questo non gestirà correttamente i valori negativi. decimalToHex (-6, 4) restituisce 00-6.
JonMR,

3
Ha anche problemi con i float, ma inserendo Math.round () è stato risolto. (+ 1ed)
Michael - Dov'è Clay Shirky il

Sto "estraendo" numeri da un array ('255,0,55', ecc.) E .toString (16) non ha funzionato. Tutto quello che ho avuto sono stati gli stessi numeri! Ho aggiunto la funzione "Numero" in primo piano e ora funziona! Ho trascorso solo circa quattro ore a cercare la soluzione !!
Cristofayre,

65
function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}

1
function hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
Lori,

2
Non è così difficile estenderlo, stai tagliando le ultime cifre con .slice (-number) lì. Se aggiungi più zeri in primo piano funzionerà bene.
Tatarize,

19
ES6 const hex = d => Number(d).toString(16).padStart(2, '0')😁
Ninh Pham,

39

Per completezza, se si desidera la rappresentazione esadecimale del complemento a due di un numero negativo, è possibile utilizzare l' operatore di spostamento zero-fill-right>>> . Per esempio:

> (-1).toString(16)
"-1"

> ((-2)>>>0).toString(16)
"fffffffe"

C'è comunque una limitazione: gli operatori bit a bit di JavaScript trattano i loro operandi come una sequenza di 32 bit , ovvero si ottiene il complemento a due bit a 32 bit.


2
questa è di gran lunga la risposta più preziosa a questa domanda :)
albertjan

Scavare tutte le domande perché C# number to hexadecimalstava producendo risultati diversi Javascript number to hexadecimal. Sembra che Javascript abbia il problema con i numeri negativi. Questa risposta sembra essere la soluzione al problema.
goamn

Questo è stato di grande aiuto, grazie! Lo stavo usando per i colori RGB, quindi per ottenere la variante a 24 bit, tagliare i primi due caratteri (il FF extra) -((-2)>>>0).toString(16).substring(2)
antonyh,

36

Con imbottitura:

function dec2hex(i) {
   return (i+0x10000).toString(16).substr(-4).toUpperCase();
}

2
@Lucas Restituisce gli ultimi 4 caratteri.
Gabriel,

19

Senza il ciclo:

function decimalToHex(d) {
  var hex = Number(d).toString(16);
  hex = "000000".substr(0, 6 - hex.length) + hex;
  return hex;
}

// Or "#000000".substr(0, 7 - hex.length) + hex;
// Or whatever
// *Thanks to MSDN

Inoltre, non è meglio non usare i loop test che devono essere valutati?

Ad esempio, anziché:

for (var i = 0; i < hex.length; i++){}

avere

for (var i = 0, var j = hex.length; i < j; i++){}

19

Combinando alcune di queste buone idee per una funzione da RGB a valore esadecimale (aggiungi #altrove per HTML / CSS):

function rgb2hex(r,g,b) {
    if (g !== undefined)
        return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1);
    else
        return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1);
}

Grazie per questo! Consiglio di lasciare un commento molto tempo fa. Era la chiave della mia risposta. stackoverflow.com/questions/5560248/...
Pimp Trizkit

16

La risposta accettata non ha tenuto conto dei codici esadecimali restituiti a cifra singola. Questo è facilmente regolabile da:

function numHex(s)
{
    var a = s.toString(16);
    if ((a.length % 2) > 0) {
        a = "0" + a;
    }
    return a;
}

e

function strHex(s)
{
    var a = "";
    for (var i=0; i<s.length; i++) {
        a = a + numHex(s.charCodeAt(i));
    }

    return a;
}

Credo che le risposte di cui sopra siano state pubblicate più volte da altri in un modo o nell'altro. Li avvolgo in una funzione toHex () in questo modo:

function toHex(s)
{
    var re = new RegExp(/^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/);

    if (re.test(s)) {
        return '#' + strHex( s.toString());
    }
    else {
        return 'A' + strHex(s);
    }
}

Si noti che l'espressione numerica regolare proviene da oltre 10 utili funzioni JavaScript per le espressioni regolari per migliorare l'efficienza delle applicazioni Web .

Aggiornamento: dopo aver testato questa cosa più volte ho trovato un errore (virgolette doppie in RegExp), quindi l'ho risolto. PERÒ! Dopo un bel po 'di test e dopo aver letto il post di Almaz, mi sono reso conto che non riuscivo a far funzionare i numeri negativi.

Inoltre - ho fatto qualche lettura su questo e dato che tutti i numeri JavaScript sono memorizzati come parole a 64 bit, non importa quale - ho provato a modificare il codice numHex per ottenere la parola a 64 bit. Ma si scopre che non puoi farlo. Se inserisci "3.14159265" COME NUMERO in una variabile, tutto ciò che sarai in grado di ottenere è il "3", perché la parte frazionaria è accessibile solo moltiplicando il numero per dieci (IE: 10.0) ripetutamente. O, in altre parole, il valore esadecimale di 0xF fa sì che il valore in virgola mobile venga tradotto in un numero intero prima che sia ANDed, il che rimuove tutto ciò che sta dietro al punto. Invece di prendere il valore nel suo insieme (cioè: 3.14159265) e ANDing il valore in virgola mobile rispetto al valore 0xF.

Quindi la cosa migliore da fare, in questo caso, è convertire 3.14159265 in una stringa e poi semplicemente convertire la stringa. A causa di quanto sopra, rende anche più semplice la conversione di numeri negativi poiché il segno meno diventa 0x26 sulla parte anteriore del valore.

Quindi quello che ho fatto è stato determinare che la variabile contiene un numero: basta convertirlo in una stringa e convertire la stringa. Questo significa per tutti che sul lato server sarà necessario rimuovere la stringa in entrata e quindi determinare che le informazioni in entrata sono numeriche. Puoi farlo facilmente semplicemente aggiungendo un "#" all'inizio dei numeri e una "A" all'inizio di una stringa di caratteri che ritorna. Vedi la funzione toHex ().

Divertiti!

Dopo un altro anno e molte riflessioni, ho deciso che la funzione "toHex" (e ho anche una funzione "fromHex") doveva davvero essere rinnovata. L'intera domanda era "Come posso farlo in modo più efficiente?" Ho deciso che una funzione esadecimale da / a non dovrebbe interessare se qualcosa è una parte frazionaria ma allo stesso tempo dovrebbe garantire che le parti frazionarie siano incluse nella stringa.

Quindi la domanda divenne: "Come fai a sapere che stai lavorando con una stringa esadecimale?". La risposta è semplice Utilizzare le informazioni pre-stringa standard già riconosciute in tutto il mondo.

In altre parole, usa "0x". Quindi ora la mia funzione toHex sembra vedere se è già lì e se lo è - restituisce semplicemente la stringa che gli è stata inviata. Altrimenti, converte la stringa, il numero, qualunque cosa. Ecco la funzione toHex rivista:

/////////////////////////////////////////////////////////////////////////////
//  toHex().  Convert an ASCII string to hexadecimal.
/////////////////////////////////////////////////////////////////////////////
toHex(s)
{
    if (s.substr(0,2).toLowerCase() == "0x") {
        return s;
    }

    var l = "0123456789ABCDEF";
    var o = "";

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=0; i<s.length; i++) {
        var c = s.charCodeAt(i);

        o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1);
    }

    return "0x" + o;
}

Questa è una funzione molto veloce che tiene conto di singole cifre, numeri in virgola mobile e persino controlla se la persona sta inviando un valore esadecimale per essere nuovamente esadecimale. Utilizza solo quattro chiamate di funzione e solo due di queste sono nel loop. Per annullare l'esadecimale dei valori utilizzati:

/////////////////////////////////////////////////////////////////////////////
//  fromHex().  Convert a hex string to ASCII text.
/////////////////////////////////////////////////////////////////////////////
fromHex(s)
{
    var start = 0;
    var o = "";

    if (s.substr(0,2).toLowerCase() == "0x") {
        start = 2;
    }

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=start; i<s.length; i+=2) {
        var c = s.substr(i, 2);

        o = o + String.fromCharCode(parseInt(c, 16));
    }

    return o;
}

Come la funzione toHex (), la funzione fromHex () cerca prima lo "0x" e poi traduce le informazioni in arrivo in una stringa se non è già una stringa. Non so come non sarebbe una stringa - ma per ogni evenienza - controllo. La funzione quindi passa, prendendo due caratteri e traducendoli in caratteri ASCII. Se vuoi che traduca Unicode, dovrai cambiare il ciclo in modo che passi da quattro (4) caratteri alla volta. Ma allora devi anche assicurarti che la stringa NON sia divisibile per quattro. Se lo è, allora è una stringa esadecimale standard. (Ricorda che la stringa ha "0x" sul davanti.)

Un semplice script di test per mostrare che -3.14159265, quando convertito in una stringa, è ancora -3.14159265.

<?php

    echo <<<EOD
<html>
    <head><title>Test</title>
        <script>
            var a = -3.14159265;
            alert( "A = " + a );
            var b = a.toString();
            alert( "B = " + b );
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

?>

A causa del modo in cui JavaScript funziona rispetto alla funzione toString (), è possibile eliminare tutti quei problemi che prima causavano problemi. Ora tutte le stringhe e i numeri possono essere convertiti facilmente. Inoltre, cose come gli oggetti causeranno un errore generato da JavaScript stesso. Credo che questo sia buono come si arriva. L'unico miglioramento rimasto è che W3C includa solo una funzione toHex () e fromHex () in JavaScript.


Penso che tu abbia ancora del lavoro da fare qui ... if( s.substr(0,2)prima if (typeof s != "string")probabilmente non è quello che vuoi, per esempio. Ciò che ero tornato non era nemmeno quello che mi aspettavo ( toHex(0x1f635)"0x313238353635"). Non ho studiato ulteriormente.
ruffin,

Credo che tu sia errato. Il tuo esempio sta usando una stringa esadecimale che NON è una stringa, ma un numero. Pertanto 1f635 uscirà così com'è. Se avessi inserito "0x1f635" sarebbe uscito diversamente. (cioè: la routine avrebbe appena restituito il numero esadecimale che avevi inviato alla routine.) :-)
Mark Manning,

Il primo punto era che non puoi usare substr& toLowerCasesu una non stringa ... quindi o le typeofnecessità devono arrivare prima o, se ti aspettavi toHexdi lanciare una non stringa proprio lì, dovresti rimuovere typeofcompletamente il segno di spunta. Ha senso? Cioè, se avessi usato il codice qui senza modifiche e chiamato toHex(0x1f635), avrei ottenuto Uncaught TypeError: s.substr is not a function. Se sposto il cast della stringa in precedenza, hai ragione, il numero si lancia prima in decimale, forse, e le cose vanno lateralmente. Il che ovviamente significa che non puoi fare un semplice cast qui se snon è una stringa.
Ruffin,

In realtà, sotto XP funziona bene. Ci sono stati un certo numero di aggiornamenti a Javascript che stanno rendendo Javascript tipografico. Il che darebbe un'eccezione. Sotto XP funziona jusr. Almeno per me. In un mondo tipografico, inserire "if (typeof s ==" string "&& s.substr (0,2) ==" 0x ") {return s;}" è appropriato. Ma ox1f635 non è ancora una stringa. :-)
Mark Manning il

12
var number = 3200;
var hexString = number.toString(16);

Il 16 è il radix e ci sono 16 valori in un numero esadecimale :-)


12

Per chiunque sia interessato, ecco un JSFiddle che confronta la maggior parte delle risposte fornite a questa domanda .

Ed ecco il metodo con cui sono finito:

function decToHex(dec) {
  return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}

Inoltre, tieni presente che se stai cercando di convertire da decimale a esadecimale per l'uso in CSS come tipo di dati a colori , potresti invece preferire estrarre i valori RGB dal decimale e utilizzare rgb () .

Ad esempio ( JSFiddle ):

let c = 4210330 // your color in decimal format
let rgb = [(c & 0xff0000) >> 16,  (c & 0x00ff00) >> 8,  (c & 0x0000ff)]

// Vanilla JS:
document..getElementById('some-element').style.color = 'rgb(' + rgb + ')'
// jQuery:
$('#some-element').css('color', 'rgb(' + rgb + ')')

Questo imposta #some-elementla colorproprietà CSS su rgb(64, 62, 154).


10

Vincolato / imbottito a un determinato numero di caratteri:

function decimalToHex(decimal, chars) {
    return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}

2
Questo converte un numero in una stringa esadecimale E pad che portano zeri, questo è bello!
Gordon,

10

Ecco una versione ridotta di ECMAScript 6:

const convert = {
  bin2dec : s => parseInt(s, 2).toString(10),
  bin2hex : s => parseInt(s, 2).toString(16),
  dec2bin : s => parseInt(s, 10).toString(2),
  dec2hex : s => parseInt(s, 10).toString(16),
  hex2bin : s => parseInt(s, 16).toString(2),
  hex2dec : s => parseInt(s, 16).toString(10)
};

convert.bin2dec('111'); // '7'
convert.dec2hex('42');  // '2a'
convert.hex2bin('f8');  // '11111000'
convert.dec2bin('22');  // '10110'

In forte disaccordo con @HypersoftSystems, se l'ambiente o la situazione ti consentono, usa ES6. Non tutti gli script devono essere eseguiti in interpreti bootleg legacy, anche Babel esiste per un motivo. Infine, ES6 è molto più leggibile se lo conosci. Detto questo, dare risposte JS standard potrebbe aiutare più persone, ma considerando che ci sono altre risposte per le versioni precedenti di JS, avere una risposta ES6 è solo vantaggioso, il rant "è così che ho fatto in passato" non è assolutamente necessario.
WiR3D,

Le opinioni non forniscono fatti, pertanto il tuo "argomento" non è valido. @ WiR3D
Hypersoft Systems,

@HypersoftSystems è valido quanto il tuo se non di più, dal momento che il tuo è altrettanto supponente e limita il contesto a un contesto che probabilmente non è valido nella maggior parte delle applicazioni moderne.
WiR3D

errore utente: "altrettanto supponente", "probabilmente" e "la maggior parte".
Hypersoft Systems,

9
function dec2hex(i)
{
  var result = "0000";
  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
}

1
+1 grazie! Quando si lavora con CSS, toString (16) è importante per ottenere risultati come FF0000
Tyler Egeto,

7
quando si lavora con CSS (o SVG, che accetta le specifiche di colore in stile CSS) è possibile eludere l'intero problema scrivendo color: rgb(r,g,b)dove rg e b sono numeri decimali.
telent

1
Dovrebbe essere: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 }
Aykut Çevik,

9

Se vuoi convertire un numero in una rappresentazione esadecimale di un valore di colore RGBA, ho trovato che questa è la combinazione più utile di diversi suggerimenti da qui:

function toHexString(n) {
    if(n < 0) {
        n = 0xFFFFFFFF + n + 1;
    }
    return "0x" + ("00000000" + n.toString(16).toUpperCase()).substr(-8);
}

8

Il commento AFAIK 57807 è sbagliato e dovrebbe essere simile a: var hex = Number (d) .toString (16); invece di var hex = parseInt (d, 16);

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}

6

E se il numero è negativo?

Ecco la mia versione

function hexdec (hex_string) {
    hex_string=((hex_string.charAt(1)!='X' && hex_string.charAt(1)!='x')?hex_string='0X'+hex_string : hex_string);
    hex_string=(hex_string.charAt(2)<8 ? hex_string =hex_string-0x00000000 : hex_string=hex_string-0xFFFFFFFF-1);
    return parseInt(hex_string, 10);
}

5

Sto eseguendo la conversione in stringa esadecimale in un ciclo piuttosto grande, quindi ho provato diverse tecniche per trovare quella più veloce. Di conseguenza, i miei requisiti erano avere una stringa di lunghezza fissa e codificare correttamente i valori negativi (-1 => ff..f).

Semplice .toString(16)non ha funzionato per me poiché avevo bisogno di valori negativi per essere codificato correttamente. Il seguente codice è il più veloce che ho testato finora su valori di 1-2 byte (nota che symbolsdefinisce il numero di simboli di output che vuoi ottenere, ovvero per intero a 4 byte dovrebbe essere uguale a 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;
}

Funziona più velocemente rispetto .toString(16)ai numeri di 1-2 byte e più lentamente sui numeri più grandi (quando symbols> = 6), ma dovrebbe comunque superare i metodi che codificano correttamente i valori negativi.


5

Come afferma la risposta accettata, il modo più semplice per convertire da decimale a esadecimale è var hex = dec.toString(16). Tuttavia, potresti preferire aggiungere una conversione di stringa, in quanto garantisce che le rappresentazioni di stringa come "12".toString(16)funzionino correttamente.

// Avoids a hard-to-track-down bug by returning `c` instead of `12`
(+"12").toString(16);

Per invertire il processo puoi anche utilizzare la soluzione di seguito, poiché è ancora più breve.

var dec = +("0x" + hex);

Sembra essere più lento in Google Chrome e Firefox, ma è significativamente più veloce in Opera. Vedi http://jsperf.com/hex-to-dec .


5

Come convertire i decimali in esadecimali in JavaScript

Non sono riuscito a trovare una conversione da decimale brutalmente pulito / semplice in esadecimale che non ha comportato un pasticcio di funzioni e array ... quindi ho dovuto farlo da solo.

function DecToHex(decimal) { // Data (decimal)

    length = -1;    // Base string length
    string = '';    // Source 'string'

    characters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // character array

    do { // Grab each nibble in reverse order because JavaScript has no unsigned left shift

        string += characters[decimal & 0xF];   // Mask byte, get that character
        ++length;                              // Increment to length of string

    } while (decimal >>>= 4); // For next character shift right 4 bits, or break on 0

    decimal += 'x'; // Convert that 0 into a hex prefix string -> '0x'

    do
        decimal += string[length];
    while (length--); // Flip string forwards, with the prefixed '0x'

    return (decimal); // return (hexadecimal);
}

/* Original: */

D = 3678;    // Data (decimal)
C = 0xF;    // Check
A = D;        // Accumulate
B = -1;        // Base string length
S = '';        // Source 'string'
H = '0x';    // Destination 'string'

do {
    ++B;
    A& = C;

    switch(A) {
        case 0xA: A='A'
        break;

        case 0xB: A='B'
        break;

        case 0xC: A='C'
        break;

        case 0xD: A='D'
        break;

        case 0xE: A='E'
        break;

        case 0xF: A='F'
        break;

        A = (A);
    }
    S += A;

    D >>>= 0x04;
    A = D;
} while(D)

do
    H += S[B];
while (B--)

S = B = A = C = D; // Zero out variables
alert(H);    // H: holds hexadecimal equivalent

5
Oh mio ... questo è un modo davvero terribile e orribile di farlo, fatto in uno stile di programmazione ancora più brutto. Onestamente: cosa c'è di sbagliato nelle interruzioni di riga e nel rientro? Variabili a lettera singola? Veramente?
Victor Schröder,

1
L'ho rivisto. È così orribile? Ed è lo stile migliore ?? Inizialmente pensavo che sarebbe stato più facile capire con ogni singolo passo "letteralmente" spiegato così con le lettere ... a volte posso essere piuttosto stupido
JonLikeSquirrel il

4
Scusa, sì, ancora terribile. Il tuo codice utilizza ancora molti loop inefficienti e sta inquinando lo spazio dei nomi globale, tra le altre questioni. L'approccio stesso è eccessivo per un'attività che può essere eseguita con una semplice chiamata di funzione. Se vuoi migliorare il tuo stile di codifica in JS, ti consiglio vivamente di leggere materiale come w3.org/wiki/JavaScript_best_practices e google.github.io/styleguide/javascriptguide.xml . Basta google sull'argomento.
Victor Schröder,

1
Ho fatto un test di velocità in Chrome e la mia funzione di overkill è circa il 30% più veloce di .toString (16), mentre in Firefox la mia funzione è del 40% più lenta di .toString (16) ... Chrome dimostra che i miei loop eccessivi sono PIÙ efficienti rispetto alla funzione nativa .toString (16) del browser, mentre Firefox dimostra perché più persone preferiscono Chrome. O è al contrario ?? Un giorno Chrome potrebbe persino aggiornare a .toString (16) più veloce, rendendomi errato in entrambi i casi! Ad ogni modo non sbaglio completamente, e tu non sei del tutto giusto. A parte il mio ego, capisco almeno il 30%. ;)
JonLikeSquirrel il

2
Non devi mai dichiarare una matrice di stringhe contenenti caratteri singoli ciascuno. Dichiara semplicemente una stringa di caratteri. Puoi ottenere un carattere da una stringa come faresti con una matrice, usando parentesi quadre.
David Spector,

3

Per riassumere tutto;

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;
}

Tuttavia, se non è necessario convertirlo nuovamente in un numero intero alla fine (ad esempio per i colori), è sufficiente assicurarsi che i valori non siano negativi.


2

Non ho trovato una risposta chiara, senza controlli se è negativa o positiva, che utilizza il complemento a due (numeri negativi inclusi). Per questo, mostro la mia soluzione a un byte:

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

È possibile utilizzare questa istruzione per qualsiasi numero byte, solo si aggiunge FFnelle rispettive posizioni. Ad esempio, a due byte:

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

Se si desidera eseguire il cast di un numero intero di array per la stringa esadecimale:

s = "";
for(var i = 0; i < arrayNumber.length; ++i) {
    s += ((0xFF + arrayNumber[i] +1) & 0x0FF).toString(16);
}

2

Nel caso in cui desideri convertire in una rappresentazione JavaScript o CSS "completa", puoi utilizzare qualcosa come:

  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

Se stai cercando la conversione di numeri interi grandi, ovvero numeri maggiori di Number.MAX_SAFE_INTEGER - 9007199254740991, puoi utilizzare il seguente codice

const hugeNumber = "9007199254740991873839" // Make sure its in String
const hexOfHugeNumber = BigInt(hugeNumber).toString(16);
console.log(hexOfHugeNumber)


1

Questo si basa sulle soluzioni di Prestaul e Tod. Tuttavia, questa è una generalizzazione che tiene conto delle dimensioni variabili di una variabile (ad es. Analisi del valore firmato da un registro seriale del microcontrollore).

function decimalToPaddedHexString(number, bitsize)
{ 
  let byteCount = Math.ceil(bitsize/8);
  let maxBinValue = Math.pow(2, bitsize)-1;

  /* In node.js this function fails for bitsize above 32bits */
  if (bitsize > 32)
    throw "number above maximum value";

  /* Conversion to unsigned form based on  */
  if (number < 0)
    number = maxBinValue + number + 1;

  return "0x"+(number >>> 0).toString(16).toUpperCase().padStart(byteCount*2, '0');
}

Script di prova:

for (let n = 0 ; n < 64 ; n++ ) { 
     let s=decimalToPaddedHexString(-1, n); 
     console.log(`decimalToPaddedHexString(-1,${(n+"").padStart(2)}) = ${s.padStart(10)} = ${("0b"+parseInt(s).toString(2)).padStart(34)}`);
   }

Risultati del test:

decimalToPaddedHexString(-1, 0) =        0x0 =                                0b0
decimalToPaddedHexString(-1, 1) =       0x01 =                                0b1
decimalToPaddedHexString(-1, 2) =       0x03 =                               0b11
decimalToPaddedHexString(-1, 3) =       0x07 =                              0b111
decimalToPaddedHexString(-1, 4) =       0x0F =                             0b1111
decimalToPaddedHexString(-1, 5) =       0x1F =                            0b11111
decimalToPaddedHexString(-1, 6) =       0x3F =                           0b111111
decimalToPaddedHexString(-1, 7) =       0x7F =                          0b1111111
decimalToPaddedHexString(-1, 8) =       0xFF =                         0b11111111
decimalToPaddedHexString(-1, 9) =     0x01FF =                        0b111111111
decimalToPaddedHexString(-1,10) =     0x03FF =                       0b1111111111
decimalToPaddedHexString(-1,11) =     0x07FF =                      0b11111111111
decimalToPaddedHexString(-1,12) =     0x0FFF =                     0b111111111111
decimalToPaddedHexString(-1,13) =     0x1FFF =                    0b1111111111111
decimalToPaddedHexString(-1,14) =     0x3FFF =                   0b11111111111111
decimalToPaddedHexString(-1,15) =     0x7FFF =                  0b111111111111111
decimalToPaddedHexString(-1,16) =     0xFFFF =                 0b1111111111111111
decimalToPaddedHexString(-1,17) =   0x01FFFF =                0b11111111111111111
decimalToPaddedHexString(-1,18) =   0x03FFFF =               0b111111111111111111
decimalToPaddedHexString(-1,19) =   0x07FFFF =              0b1111111111111111111
decimalToPaddedHexString(-1,20) =   0x0FFFFF =             0b11111111111111111111
decimalToPaddedHexString(-1,21) =   0x1FFFFF =            0b111111111111111111111
decimalToPaddedHexString(-1,22) =   0x3FFFFF =           0b1111111111111111111111
decimalToPaddedHexString(-1,23) =   0x7FFFFF =          0b11111111111111111111111
decimalToPaddedHexString(-1,24) =   0xFFFFFF =         0b111111111111111111111111
decimalToPaddedHexString(-1,25) = 0x01FFFFFF =        0b1111111111111111111111111
decimalToPaddedHexString(-1,26) = 0x03FFFFFF =       0b11111111111111111111111111
decimalToPaddedHexString(-1,27) = 0x07FFFFFF =      0b111111111111111111111111111
decimalToPaddedHexString(-1,28) = 0x0FFFFFFF =     0b1111111111111111111111111111
decimalToPaddedHexString(-1,29) = 0x1FFFFFFF =    0b11111111111111111111111111111
decimalToPaddedHexString(-1,30) = 0x3FFFFFFF =   0b111111111111111111111111111111
decimalToPaddedHexString(-1,31) = 0x7FFFFFFF =  0b1111111111111111111111111111111
decimalToPaddedHexString(-1,32) = 0xFFFFFFFF = 0b11111111111111111111111111111111
Thrown: 'number above maximum value'

Nota: non sono troppo sicuro del perché non superi i 32 bit


-3

Ecco la mia soluzione:

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

La domanda dice: "Come convertire i decimali in esadecimali in JavaScript" . Mentre, la domanda non specifica che la stringa esadecimale dovrebbe iniziare con un prefisso 0x, chiunque scriva codice dovrebbe sapere che 0x viene aggiunto ai codici esadecimali per distinguere i codici esadecimali da identificatori programmatici e altri numeri (1234 potrebbe essere esadecimale, decimale o anche ottale).

Pertanto, per rispondere correttamente a questa domanda, ai fini della scrittura di script, è necessario aggiungere il prefisso 0x.

La funzione Math.abs (N) converte i negativi in ​​positivi e, come bonus, non sembra che qualcuno lo abbia fatto passare attraverso una cippatrice.

La risposta che volevo avrebbe avuto un identificatore di ampiezza di campo, quindi potremmo ad esempio mostrare i valori 8/16/32/64 bit come li vedresti elencati in un'applicazione di modifica esadecimale. Questa è la risposta effettiva e corretta.


1
Nella pratica di codifica generale, qualsiasi sequenza alfanumerica che inizia con una lettera, NON È UN NUMERO. Ad esempio: ABCDEF012345678 è un identificatore valido in quasi tutti i linguaggi di programmazione del pianeta.
Hypersoft Systems,

1
Oh, e il prefisso 0x non è un problema per JavaScript: Number('0xFF') === 255;per tutti quelli che vogliono l'operazione inversa.
Hypersoft Systems,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.