我需要一种高效的(本地读取)方法来将ArrayBuffer转换为需要在多部分帖子上使用的base64字符串。ArrayBuffer以base64编码的字符串
回答
function _arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[ i ]);
}
return window.btoa(binary);
}
但是,非本机实现方式更快,例如, https://gist.github.com/958841 看到http://jsperf.com/encoding-xhr-image-data/6
这对我工作得很好:
var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));
在ES6,语法是有点简单:
let base64String = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
正如在评论中指出,这种方法可能会导致当ArrayBuffer较大时,在某些浏览器中出现运行时错误。在任何情况下,确切的大小限制都取决于实现。
function _arrayBufferToBase64(uarr) {
var strings = [], chunksize = 0xffff;
var len = uarr.length;
for (var i = 0; i * chunksize < len; i++){
strings.push(String.fromCharCode.apply(null, uarr.subarray(i * chunksize, (i + 1) * chunksize)));
}
return strings.join("");
}
这是更好的,如果你使用JSZip用于解压缩归档从字符串
有什么错? – RouR 2015-07-27 09:07:09
这个函数并没有做它应该做的事情:https://jsfiddle.net/as9t9ebf/ – 2015-12-26 21:55:50
我提出这一建议是不要使用本地btoa
策略,因为它们不正确编码所有ArrayBuffer
的...
rewrite the DOMs atob() and btoa()
由于DOMStrings是16位编码的字符串,在大多数浏览器上一个Unicode字符串调用window.btoa会引起CHARAC如果字符超出8位ASCII编码字符的范围,则超出范围异常。
虽然我从来没有遇到过这种确切的错误,我发现许多我试图编码的ArrayBuffer
的已编码不正确。
我会使用MDN建议或要点。
还有另一种异步方式使用Blob和的FileReader。
我没有测试性能。但这是一种不同的思考方式。
function arrayBufferToBase64(buffer, callback) {
var blob = new Blob([buffer],{type:'application/octet-binary'});
var reader = new FileReader();
reader.onload = function(evt){
var dataurl = evt.target.result;
callback(dataurl.substr(dataurl.indexOf(',')+1));
};
reader.readAsDataURL(blob);
}
//example:
var buf = new Uint8Array([11,22,33]);
arrayBufferToBase64(buf, console.log.bind(console)); //"CxYh"
我用这个,并为我工作。
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[ i ]);
}
return window.btoa(binary);
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
不安全。请参阅@chemoish answer – Kugel 2017-08-24 04:57:32
可以通过使用Array.prototype.slice
导出从ArrayBuffer
正常阵列。 使用像Array.prototype.map
这样的函数将字节转换为字符并将它们一起转换为形成字符串。
function arrayBufferToBase64(ab){
var dView = new Uint8Array(ab); //Get a byte view
var arr = Array.prototype.slice.call(dView); //Create a normal array
var arr1 = arr.map(function(item){
return String.fromCharCode(item); //Convert
});
return window.btoa(arr1.join('')); //Form a string
}
由于没有字符串连接在其中运行,因此此方法更快。
不安全。看到@chemoish回答 – Kugel 2017-08-24 04:58:02
对于那些谁喜欢总之,这里是一个另一种使用Array.reduce
这不会导致堆栈溢出:
var base64 = btoa(
new Uint8Array(arrayBuffer)
.reduce((data, byte) => data + String.fromCharCode(byte), '')
);
性感! – Kano 2018-01-04 09:36:43
下面是两个简单的功能Uint8Array转换为Base64编码字符串,然后再返回
arrayToBase64String(a) {
return btoa(String.fromCharCode(...a));
}
base64StringToArray(s) {
let asciiString = atob(s);
return new Uint8Array([...asciiString].map(char => char.charCodeAt(0)));
}
- 1. 从Base64编码字符串
- 2. java字符串base64编码
- 3. Java Base64编码的字符串与.NET Base64编码的字符串
- 4. 解码编码的base64字符串
- 5. 的Python:解码base64编码字符串
- 6. 解码Base64编码字符串
- 7. Base64编码的InputStream字符串
- 8. Android的Base64编码字符串检测
- 9. PHP的Base64盐字符串编码
- 10. Base64编码的字符串到文件
- 11. 自动解码以base64格式编码的多行字符串
- 12. Base64编码或bin2hex随机字符串
- 13. 使用base64编码字符串URL
- 14. base64从终端编码字符串?
- 15. Base64编码“字符串” - 命令行Windows?
- 16. Junit测试base64编码字符串
- 17. Base64在SQL中编码utf8字符串
- 18. 验证Base64编码字符串
- 19. base64编码为UTF-8字符串
- 20. 将.net字符串对象转换为base64编码字符串
- 21. base64编码的字符串是否可以包含空格?
- 22. 解码base64编码字符串与URL转义字符
- 23. 编译和BASE64字符串
- 24. Base64编码:非法base64字符3c
- 25. MIME Base64编码宽字符
- 26. python base64字符串解码
- 27. java解码base64字符串
- 28. 解码base64字符串?
- 29. base64编码字符串中出现+字符的概率
- 30. 为什么base64编码的字符串使用字符+和/?
我尝试了链接的非本地实现,它花了1分半钟来转换一个1M大小的缓冲区,而上面的循环代码只花了1秒。 – cshu 2013-06-28 18:12:31
我喜欢这种方法的简单性,但所有的字符串连接都可能是昂贵的。它看起来像构建一个字符数组,并且在最后使用join()方法在Firefox,IE和Safari上速度要快得多(但在Chrome上速度要慢很多):http://jsperf.com/tobase64-实现 – JLRishe 2014-05-14 09:30:37
我正在使用此功能阵列缓冲区base64转换,但我无法取回数组缓冲区。我在这里声明了一个_base64ToArrayBuffer()函数:http://codeshare.io/PT4pb,但是这给了我一个错误,因为:'在'Window'上无法执行'atob':要解码的字符串编码不正确。 – bawejakunal 2015-07-11 13:27:50