2013-09-05 20 views
7

Ho bisogno di trovare un modo per convertire un numero elevato in una stringa esadecimale in javascript. Subito dopo la mazza, ho provato myBigNumber.toString(16) ma se myBigNumber ha un valore molto alto (es. 1298925419114529174706173), allora myBigNumber.toString(16) restituirà un risultato errato, che è semplicemente geniale. Ho provato a scrivere per propria funzione come segue:Convertire un intero grande in una stringa esadecimale in Javascript

function (integer) { 
    var result = ''; 

    while (integer) { 
     result = (integer % 16).toString(16) + result; 
     integer = Math.floor(integer/16); 
    } 
} 

Tuttavia, un gran numero modulo 16 tutti ritorno 0 (I che questo problema fondamentale è la causa del problema con toString ho anche provato a sostituire (integer % 16) con (integer - 16 * Math.floor(integer/16)) ma che aveva. lo stesso problema.

ho già ricercati in biblioteca Big Integer JavaScript, ma che è un enorme plug-in per uno, problema si spera relativamente semplice.

Ogni pensiero quanto a come posso ottenere un risultato valido? Forse alcuni tipo di approccio divide et impera? davvero piuttosto bloccato qui.

+1

Questo è un problema con i grandi numeri, non la conversione in _String_ '1298925419114529174706173 == = 1298925419114529174706170' –

+0

Il tuo numero è molto più grande di javascript intero, vedi http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number -can-go-t – bfavaretto

+2

beh non è divertente. Se avessi una rappresentazione di base 10 del numero come una stringa, c'è un modo semplice per convertirlo in una stringa esadecimale? –

risposta

2

I numeri in questione sono sopra il numero intero più grande di javascript. Tuttavia, puoi lavorare con numeri così grandi con delle stringhe e ci sono alcuni plugin che possono aiutarti a farlo. Un esempio che è particolarmente utile in questa circostanza è hex2dec

6

Supponendo che avete il vostro intero memorizzato come una stringa decimale come '1298925419114529174706173':

function dec2hex(str){ // .toString(16) only works up to 2^53 
    var dec = str.toString().split(''), sum = [], hex = [], i, s 
    while(dec.length){ 
     s = 1 * dec.shift() 
     for(i = 0; s || i < sum.length; i++){ 
      s += (sum[i] || 0) * 10 
      sum[i] = s % 16 
      s = (s - sum[i])/16 
     } 
    } 
    while(sum.length){ 
     hex.push(sum.pop().toString(16)) 
    } 
    return hex.join('') 
} 
+1

funziona per me ... –

Problemi correlati