2013-04-02 13 views
7

Mi è stato chiesto di convertire gli interi in numeri binari a 32 bit. Viene quindi utilizzato integer.toString(2) e ottenuto il valore richiesto in formato binario a 32 bit di 0 e 1. Ma in realtà quello che mi è stato chiesto di fare è convertire il numero intero in 4 byte di dati. Non riesco a ottenere l'output come suggerito. Ho usato integer.toString(8), integer.toString(16). ma inutile.Convertire un numero intero a 32 bit in 4 byte di dati in javascript

Esempio:

num=1065489844 
num.toString(2) //Output: 111111100000100001010110110100 
num.toString(8) //Output: 7740412664 

Si prega di farmi sapere, dove sono carenti.

+3

stringhe non sono generalmente gli stessi dati binari . Se potessi usare una base di 256 sarebbero uguali, ma 'toString()' supporta solo basi fino a 36. – unwind

+3

Che cosa vuoi che sia l'output? Non è chiaro quale dovrebbe essere l'output previsto di 4 byte? – jfriend00

+1

Supponi che il tuo intero sia memorizzato in una variabile 'x'. Quindi usando 'x | 0' assicurerà che sia un numero intero a 32 bit. Non ho idea di cosa intenda per "numero binario". Ogni numero intero in ogni linguaggio di programmazione è memorizzato come bit. –

risposta

1

se avete bisogno di un output in formato esadecimale, ecco il codice.

/* Convert value as 8-bit unsigned integer to 2 digit hexadecimal number. */ 

function hex8(val) { 
    val &= 0xFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00" + hex).slice(-2); 
} 

/* Convert value as 16-bit unsigned integer to 4 digit hexadecimal number. */ 

function hex16(val) { 
    val &= 0xFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("0000" + hex).slice(-4); 
} 

/* Convert value as 32-bit unsigned integer to 8 digit hexadecimal number. */ 

function hex32(val) { 
    val &= 0xFFFFFFFF; 
    var hex = val.toString(16).toUpperCase(); 
    return ("00000000" + hex).slice(-8); 
} 


var num = 1065489844; 
console.log("0x" + hex32(num)); // will output 0x3F8215B4 
+0

Quello che ho fatto è che ho usato 'num.tostring (2)' e ho inviato il valore a un file di testo, e dopo l'osservazione, ho scoperto che la dimensione del file di testo è 32 byte, ma non 4 byte. Quindi, come detto da @unwind, ho bisogno di usare la base di 256. Per favore qualcuno può dirmi, come usare la base di 256 per ottenere il numero binario effettivo. – user1647017

+0

È necessario salvare i dati come binari (non come ASCII), quindi le dimensioni del file saranno 4 byte. – Bechir

+0

Il seguente codice consente di scaricare un file che contiene il tuo numero in formato binario. La dimensione del file sarà 4 byte. ' function generateData (num) { var data = new Uint8Array (4); for (var i = 0; i <4; i ++) { data [i] = (num >> (i * 8)) & 0xff; } var blob = new Blob ([i dati], { Tipo: 'Application/octet-stream' }); return window.URL.createObjectURL (blob); } var num = 1065489844; documento.scrivi ('download'); ' – Bechir

11

Ora è possibile utilizzare ArrayBuffer e DataView. Sono nativi quindi le prestazioni saranno molto migliori se è necessario utilizzarle molto spesso.

function toBytesInt32 (num) { 
    arr = new ArrayBuffer(4); // an Int32 takes 4 bytes 
    view = new DataView(arr); 
    view.setUint32(0, num, false); // byteOffset = 0; litteEndian = false 
    return arr; 
} 

uguale a

function toBytesInt32 (num) { 
    arr = new Uint8Array([ 
     (num & 0xff000000) >> 24, 
     (num & 0x00ff0000) >> 16, 
     (num & 0x0000ff00) >> 8, 
     (num & 0x000000ff) 
    ]); 
    return arr.buffer; 
} 

che utilizzano JavaScript operatori bit per bit per raggiungere questo obiettivo.

+0

In realtà è piuttosto interessante vedere perché '(uint8) (num & 0xFF000000) >> 24' funziona per es 'num = 0xF0000000': L'operatore >> converte i suoi operandi in due-complementi a 32-bit, quindi' 0xF0000000' passa a '-0x0FFFFFFF', che viene spostato a' -0x0F'. Uint8Array converte quindi i suoi valori in interi a 8 bit senza segno prendendo '-0x0F' modulo' 0xFF' (questo modulo NON è l'operatore '%' ma restituisce sempre risultati positivi in ​​base alle specifiche JS). Il risultato è finalmente '0xF0', come previsto. Sarebbe una bella domanda di intervista;) –

1

La risposta di SEIAROTg non genera una stringa. Ho testato a fondo con numeri positivi e negativi e questo codice ti darà un output di stringa di 4 byte che rappresenta il numero in formato big endien (il complimento di 2 0xFFFFFFFF = -1).

var toBytesInt32=function(num) { 
    var ascii=''; 
    for (let i=3;i>=0;i--) { 
     ascii+=String.fromCharCode((num>>(8*i))&255); 
    } 
    return ascii; 
}; 

dal modo in cui, se si vuole andare il contrario è possibile utilizzare

var fromBytesInt32=function(numString) { 
    var result=0; 
    for (let i=3;i>=0;i--) { 
     result+=numString.charCodeAt(3-i)<<(8*i); 
    } 
    return result; 
}; 

per convertire una stringa di 4 byte per un intero

+0

Questa è una limitazione di javascript. Javascript considera qualsiasi numero a 32 bit con la prima cifra come 1 un numero negativo. –

+0

Ho fatto un'ipotesi sbagliata sul tuo codice. La tua risposta sta funzionando bene per gli argomenti * negativi e positivi * purché siano nell'intervallo di (* firmato *) numeri interi a 32 bit. Cancellerò i miei commenti, mi dispiace per la confusione –

Problemi correlati