2014-09-20 63 views
5

我正在生成一個文件客戶端,我有十六進制數據,只是想讓用戶下載生成的文件。在JS中創建二進制blob

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

生成的文件是一個純文本文件,它包含ASCII中的十六進制數據。如何強制Blob包含二進制數據而不是文本?

回答

2

將您的數據轉換爲二進制數組,然後從中創建一個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

我想建議一個更簡單,也許更清潔(旁觀者的眼睛)的方式。 '變種的ByteArray =新Uint8Array(hexdata.match(/ {2} /克) .MAP(E => parseInt函數(即,16)));' 此拆分十六進制數據爲兩個字節大塊,將它們解析爲十六進制數字,然後將這些數組返回給Uin8Array構造函數。 – 2016-06-16 23:08:08

2

從上面的@所以我不能把功勞穆薩的解決方案得到,但它更清晰寫這是比我給他的回答跛腳評論答案。

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

也許這樣比較容易理解?我個人認爲它更清楚。

+0

blob第一個參數必須是一個數組''新Blob([byteArray],...);' – Endless 2016-06-17 07:10:24

+0

謝謝。哎呀。固定。 – 2016-06-20 18:53:43