Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Convert a base64 string into a binary Uint8 Array
var BASE64_MARKER = ';base64,';
function convertDataURIToBinary(dataURI) {
var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = dataURI.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++) {
array[i] = raw.charCodeAt(i);
}
return array;
}

PAEz commented Jul 1, 2011

Thanks, you made my day.

Owner

borismus commented Jul 2, 2011

Glad for it!

Muffo commented Oct 3, 2013

Thanks for this script!

brettz9 commented Feb 5, 2014

Small nit: your "i" needs a "var" declaration to avoid it becoming global...

Thanks Buddy :)

:) nice!

sebasao commented Aug 1, 2014

fantastic!

ajxs commented Jul 15, 2015

Real nice function!
Building on your example, if you're targeting Firefox and feeling adventurous you can shorten the function down to this:

var BASE64_MARKER = ';base64,';
function convertDataURIToBinaryFF(dataURI) { 
    var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; 
    var raw = window.atob(dataURI.substring(base64Index));
    return Uint8Array.from(Array.prototype.map.call(raw,function(x) { 
            return x.charCodeAt(0); 
        })); 
};

Unfortunately Uint8Array.from() isn't supported in other browsers yet. But this example might be useful someday!

Thanks! You save my week =D

I love you so much, same me a week, wanna invite you for a cup of coffee!

Is there any way to make this work with IE 9?

Nice! Worked like a charm for me. Thank you!

Shilpa81 commented May 5, 2016

Hi , how to call this into jsp file , and we are using angular in our application ,,,,, can u plz help me on this

Thank you! you are great !!

noktilux commented Sep 8, 2017

Thank you. This was very helpful.

I am using this modified version (made it a little more brief) with option to return the buffer:

function uri2array(uri, buffer) {
    var marker = ';base64,',
        raw = window.atob(uri.substring(uri.indexOf(marker) + marker.length)),
        n = raw.length,
        a = new Uint8Array(new ArrayBuffer(n));
    for(var i = 0; i < n ; i++){
        a[i] = raw.charCodeAt(i);
    }
    return buffer ? a.buffer : a;
}

Chrome throws an error saying "dataURI.indexOf is not a function"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment