我需要一種高效的(本地讀取)方法來將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