ArrayBuffer以base64编码的string
我需要一个高效的(本地读取)的方式来转换一个ArrayBuffer到base64string需要在多部分职位上使用。
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很大时,这个方法可能会在某些浏览器中导致运行时错误。 在任何情况下,确切的大小限制都取决于实现。
对于那些喜欢它的人来说,下面是使用Array.reduce
的另一个不会导致堆栈溢出的问题:
var base64 = btoa( new Uint8Array(arrayBuffer) .reduce((data, byte) => data + String.fromCharCode(byte), '') );
还有另外一种使用Blob和FileReader的asynchronous方式。
我没有testing性能。 但这是一种不同的思维方式。
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; }
我的build议是不要使用原生的btoa
策略 – 因为他们不能正确编码所有ArrayBuffer
的…
重写DOM的atob()和btoa()
由于DOMStrings是16位编码的string,因此在大多数浏览器中,如果字符超出了8位ASCII编码字符的范围,则在Unicodestring上调用window.btoa将导致字符超出范围exception。
虽然我从来没有遇到过这个确切的错误,但我发现,我试图编码的许多ArrayBuffer
编码都不正确。
我会使用MDNbuild议或要点。
您可以使用Array.prototype.slice
从ArrayBuffer
派生一个正常的数组。 使用像Array.prototype.map
这样的函数将字节转换为字符,并将它们连接在一起形成string。
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 }
由于没有string连接,因此该方法更快。
以下是将Uint8Array转换为Base64string并返回的两个简单函数
arrayToBase64String(a) { return btoa(String.fromCharCode(...a)); } base64StringToArray(s) { let asciiString = atob(s); return new Uint8Array([...asciiString].map(char => char.charCodeAt(0))); }
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从string解压缩文件,这样更好
- 如何在PHP中replaceMicrosoft编码的引号
- 编码window.location.hash
- 编码UTF8与语言环境en_US不匹配; select的LC_CTYPE设置需要编码LATIN1
- 在构build使用数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的hex字符?
- Java – 将String转换为有效的URI对象
- 二进制到Base64(Delphi)
- UnicodeEncodeError:“charmap”编解码器无法编码 – 字符映射到<undefined>,打印功能
- JSONstring从jQuery 1.4.1丢失?
- 如何在脚本中findUnix文件的编码