2014-09-20 106 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