简体   繁体   English

通过javascript将base64字符串转换为字节数组

[英]Convert base64 string into byte array through javascript

I want to convert "base64" string into bytes array through the javascript.我想通过javascript将“base64”字符串转换为字节数组。

I received string from the URL like.我收到了来自 URL 的字符串,例如。

 ("data:image/jpeg;base64,/9j/4QN6RXhpZgAASUkqAAgAAAAIA)

And i want to convert the string into bytes array.我想将字符串转换为字节数组。 because i need this byte array to send Rest API endpoint.因为我需要这个字节数组来发送 Rest API 端点。 The rest API Content-type=application/octet-stream.其余 API Content-type=application/octet-stream。

You can use XMLHttpRequest to do the dirty work for you:您可以使用XMLHttpRequest为您做一些肮脏的工作:

 var url = document.createElement("canvas").toDataURL(); // some data-uri var xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.responseType = "arraybuffer"; xhr.onload = function() { // result = ArrayBuffer, from here assign a view to it if (xhr.status === 200) console.log(new Uint8Array(xhr.response)); }; xhr.send();

It's a little more code than using atob() but all conversion happens internally.它比使用atob()代码多一点,但所有转换都在内部进行。 It's async too which can help with larger Data-URIs.它也是异步的,可以帮助处理更大的数据 URI。

In newer browsers (which supports it) you can instead use fetch() :在较新的浏览器(支持它)中,您可以改用fetch()

 // note: atm not all browsers support these features. fetch(document.createElement("canvas").toDataURL()) // pass in some data-uri .then(function(response) {return response.arrayBuffer()}) .then(function(buffer) { console.log(new Uint8Array(buffer)); });

You can try with the following;您可以尝试以下操作;

function test(base64StringFromURL)
{
   var parts = base64StringFromURL.split(";base64,");
   var contentType = parts[0].replace("data:", "");
   var base64 = parts[1];
   var byteArray = base64ToByteArray(base64);
   ..
}

function base64ToByteArray(base64String) {
        try {            
            var sliceSize = 1024;
            var byteCharacters = atob(base64String);
            var bytesLength = byteCharacters.length;
            var slicesCount = Math.ceil(bytesLength / sliceSize);
            var byteArrays = new Array(slicesCount);

            for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
                var begin = sliceIndex * sliceSize;
                var end = Math.min(begin + sliceSize, bytesLength);

                var bytes = new Array(end - begin);
                for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
                    bytes[i] = byteCharacters[offset].charCodeAt(0);
                }
                byteArrays[sliceIndex] = new Uint8Array(bytes);
            }
            return byteArrays;
        } catch (e) {
            console.log("Couldn't convert to byte array: " + e);
            return undefined;
        }
    }

This would prove to be much short solution.这将被证明是非常简短的解决方案。

const byteArray = new Buffer(base64String.replace(/^[\w\d;:\/]+base64\,/g, ''), 'base64');

base64String is the string containing the base 64 string. base64String 是包含 base 64 字符串的字符串。

byteArray is the array you need. byteArray 是您需要的数组。

The regex replacement is optional and is just there to deal with prefix as in the case of dataurl string.正则表达式替换是可选的,它只是用来处理前缀,就像 dataurl 字符串一样。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM