我想通过javascript将“base64”字符串转换为字节数组。
我从网址收到了字符串,如。
("data:image/jpeg;base64,/9j/4QN6RXhpZgAASUkqAAgAAAAIA)
我想将字符串转换为字节数组。因为我需要这个字节数组来发送Rest API端点。其余的API Content-type = application / octet-stream。
答案 0 :(得分:3)
您可以使用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();
这比使用atob()
的代码多一点,但所有转换都在内部进行。它也是异步的,它可以帮助更大的数据URI。
在较新的浏览器(支持它)中,您可以使用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));
});
答案 1 :(得分:2)
您可以尝试使用以下内容;
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;
}
}
答案 2 :(得分:0)
这将被证明是一个非常简短的解决方案。
const byteArray = new Buffer(base64String.replace(/^[\w\d;:\/]+base64\,/g, ''), 'base64');
<块引用>
base64String 是包含 base 64 字符串的字符串。
<块引用>byteArray 是你需要的数组。
<块引用>正则表达式替换是可选的,只是为了处理前缀,就像 dataurl 字符串一样。