首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不推荐readAsBinaryString()?

为什么不推荐readAsBinaryString()?
EN

Stack Overflow用户
提问于 2019-04-24 18:52:28
回答 1查看 1.5K关注 0票数 0

为什么不推荐readAsBinaryString()?来自W3C

readAsArrayBuffer()的使用优于readAsBinaryString(),后者是为了向后兼容性而提供的。

readAsBinaryString返回一个与另一个方法完全不同的东西,那么一个方法怎么能替代另一个方法呢?

在我的具体案例中,我有一个需要转换为base64的Blob,有很多种方法,但它们中的大多数都没有有效的内存。在我的测试中,从window.btoa的结果调用readAsBinaryString()效果最好。如果我不能再使用它(或者现在让我们说“应该”),那么我必须使用迭代和字符串连接将数组转换为字符串,这是内存效率不高的!

因此,在研究了几天之后,我并没有真正找到替代readAsBinaryString的方法,这就是为什么要问这个问题,还是您看到了一个同样适用于100‘t的blobs的替代方案?

EN

回答 1

Stack Overflow用户

发布于 2019-05-22 05:27:38

历史是,在readAsBinaryString接口存在之前,FileReader已经出现在FileReader API的早期规范中。

当ArrayBuffer接口出现时,readAsBinaryString已经被废弃了,因为它的所有用例都可以以更好的方式使用这个新接口。

实际上,readAsBinaryString只将二进制数据转换为DOMString (UTF-16)。之后你就没什么办法了。另外,将其存储为UTF-16字符串意味着它比原始数据大小占用更多的内存空间。此外,字符串是不可变的,我想您可以从这一点看出工作效率有多低。

最后,如果您确实需要这个字符串,您实际上可以通过一个ArrayBuffer进行同样的操作,您只需要在这个ArrayBuffer的Uint8视图上调用String.fromCharCode

代码语言:javascript
运行
复制
// generate some binary data
document.createElement('canvas').toBlob(blob => {
  const bin_reader = new FileReader();
  const arr_reader = new FileReader();
  let done = 0;
  bin_reader.onload = arr_reader.onload = e => {
    if(++done===2) {
      const arr_as_bin = [...new Uint8Array(arr_reader.result)]
        .map(v => String.fromCharCode(v)).join('');
      console.log('same results: ', arr_as_bin === bin_reader.result);
      console.log(arr_as_bin);
    }
  }
  bin_reader.readAsBinaryString(blob);
  arr_reader.readAsArrayBuffer(blob);
});

现在,这个方法,虽然仍然是非常无用的,已经重新添加到规范,因为一些网站确实开始使用它。

为了给OP提供更多帮助,因为他们想要做的实际上是获得他们的Blob的base64版本,那么甚至不要使用readAsArrayBuffer(),您需要的是readAsDataURL()

代码语言:javascript
运行
复制
const blob = new Blob(['hello']);
const reader = new FileReader();
reader.onload = e => {
  const dataURL = reader.result;
  const base64 = dataURL.slice(dataURL.indexOf(',')+1);
  console.log(base64);
};
reader.readAsDataURL(blob);

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55836771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档