2014-09-20 24 views
5

Generuję plik po stronie klienta, mam dane w systemie szesnastkowym i chcę, aby użytkownik mógł pobrać wygenerowany plik.Utwórz binarny obiekt blob w JS

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

Powstały plik jest plikiem tekstowym zawierającym dane szesnastkowe w ASCII. Jak zmusić Blob do przechowywania danych binarnych, tak jak jest, a nie jako tekst?

Odpowiedz

2

Konwertuj dane na tablicę binarną, a następnie utwórz z niej obiekt typu blob.

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

Chciałbym zasugerować prostszy i być może czystszy (wzrok patrzącego) sposób. 'var tablicaBitowa = nowy Uint8Array (. Hexdata.match (/ {2}/g) .map (E => parseInt (E, 16)));' to rozdzielenie danych na dwa sześciokątne porcji bajt przetwarza je jako liczby szesnastkowe na liczby, a następnie zwraca ich tablicę do konstruktora Uin8Array. –

2

Pochodzące z @ rozwiązania Musy powyżej, więc nie mogę wziąć kredyt, ale to jaśniej napisać to jako odpowiedź niż mojego kulawego komentarzu do jego odpowiedź.

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

Może to łatwiejsze do zrozumienia? Osobiście uważam, że jest jaśniejszy.

+0

Pierwszy argument blob musi być tablicą 'new Blob ([byteArray], ...);' – Endless

+0

Dzięki. Ups. Naprawiony. –