2014-09-20 7 views
5

Sto generando un file sul lato client, ho i dati in formato esadecimale e voglio solo consentire all'utente di scaricare il file generato.Crea blob binario in JS

var blob = new Blob([hexData], {type: "application/octet-stream"}); 
console.log(URL.createObjectURL(blob)); 

Il file risultante è un file di testo contenente dati esadecimali in formato ASCII. Come posso forzare il Blob a contenere i dati binari così come sono e non come testo?

risposta

2

Converti i dati in un array binario, quindi crea un blob da quello.

var byteArray = new Uint8Array(hexdata.length/2); 
for (var x = 0; x < byteArray.length; x++){ 
    byteArray[x] = parseInt(hexdata.substr(x*2,2), 16); 
} 
var blob = new Blob([byteArray], {type: "application/octet-stream"}); 

http://jsfiddle.net/mowglisanu/15h9o3d5/

+0

Mi piacerebbe suggerire un modo più semplice e forse più pulito (occhio dell'osservatore). 'var ByteArray = new Uint8Array (. Hexdata.match (/ {2}/g) .map (e => parseInt (e 16)));' Questo suddivide i dati esadecimali in due hunks byte, li analizza come esadecimale in numeri, quindi restituisce un array di questi al costruttore Uin8Array. –

2

Derivato da @ soluzione di Musa al di sopra quindi non posso prendermi il merito, ma è chiaro a scrivere questo come risposta che il mio commento zoppo per la sua risposta.

var byteArray = new Uint8Array(hexdata.match(/.{2}/g) 
           .map(e => parseInt(e, 16))); 
var blob = new Blob([byteArray], {type: "application/octet-stream"}); 

Forse è più facile da capire? Personalmente penso che sia più chiaro.

+0

Il primo argomento del blob deve essere un nuovo Blob di array ([byteArray], ...); ' – Endless

+0

Grazie. Ops. Fisso. –