15

I'm generating a file client-side, I have the data in hexadecimal and just want to let the user download the generated file.

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

The resulting file is a plain-text file containing hex data in ASCII. How can I force the Blob to contain the binary data as is and not as text?

2 Answers 2

11

Derived from @Musa's solution above so I cannot take credit, but it's clearer to write this as an answer than my lame comment to his answer.

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

Maybe this is easier to understand? I personally think it is clearer.

Sign up to request clarification or add additional context in comments.

2 Comments

The blob first argument has to be an array new Blob([byteArray], ...);
Thanks. Oops. Fixed.
8

Convert you data to a binary array then create a blob from that.

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/

1 Comment

I'd like to suggest a simpler and maybe cleaner (eye of the beholder) way. var byteArray = new Uint8Array(hexdata.match(/.{2}/g) .map(e => parseInt(e, 16))); This splits the hex data into two byte hunks, parses them as hex into numbers, then returns an array of these to the Uin8Array constructor.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.