【问题标题】:How to determine if a JavaScript ArrayBuffer contains string or binary data?如何确定 JavaScript ArrayBuffer 是否包含字符串或二进制数据?
【发布时间】:2021-11-04 18:40:18
【问题描述】:

我正在构建一个简单的应用程序,用户可以在其中将任何文件加载到 Web 浏览器中的 Monaco 编辑器中。

我正在尝试确定用户加载的文件是否是文本,因此是可编辑的。

在 JavaScript 中,我用来加载的库将加载的文件作为 ArrayBuffer 返回。当然,无论它是文本还是二进制,我都可以将其转换为文本,然后将结果扔到编辑器中。大概二进制转换为文本会在 Monaco 编辑器中显示为垃圾。

我还可以检查加载文件的 MIME 类型。这将大大有助于解决问题,但这意味着我必须以某种方式知道哪些 mime 类型是文本 - 我无法找到任何指定这一点的东西。此外,这意味着任何没有正确 mime 类型集的文件都将不可编辑。

所以我的问题是,有没有办法通过检查数据本身而不是参考 mime 类型来知道 JavaScript ArrayBuffer 的内容是文本还是二进制数据(例如图像或可执行代码)?

编辑: 这个问题不是简单地询问如何将 ArrayBuffer 转换为文本的问题的重复。简单地将 ArrayBuffer 转换为文本并不能判断这是一个包含可编辑文本的文件还是一个二进制文件。需要其他信息,例如此问题的答案中建议的幻数。

【问题讨论】:

  • 这能回答你的问题吗? Conversion between UTF-8 ArrayBuffer and String
  • 你不能只读几句然后猜猜吗?
  • 一个非常粗略的启发式方法是查看缓冲区中是否存在除 9、10 和 13 之外的代码
  • 你会在 npm 上找到multitude of different approaches :)
  • @JaredSmith 不,简单地将 ArrayBuffer 转换为文本并不能判断这是一个包含可编辑文本的文件还是二进制文件。需要其他信息,例如此问题的答案中建议的幻数。

标签: javascript


【解决方案1】:

您可以检查 ArrayBuffer 的Magic numbers。幻数是文件缓冲区中的一种常量,您可以检查它以区分多种文件格式

Wikipedia - Magic numbers

This NPM module 使用这种方法。 Here's 模块支持的文件类型列表,可以看到不支持文本类型。

更新:我已经写了一个 article 关于这个,其中包含更多解释和一个小沙盒

【讨论】:

  • 这当然指向了正确的方向,尽管所指的 npm 模块确定二进制数据是否代表已知的二进制格式,但它并没有确定它是否是文本。我根据@CherryDT 的上述评论发现的这个包确实声称做出这样的决定npmjs.com/package/istextorbinary
  • @DukeDougal 如果您不想知道确切的文本类型,您可以使用您找到的与file-type 模块结合使用的库。如果您想知道每种基于文本的文件都需要适当的解析器的文本类型,我会用 SVG 和 CSV 的两个示例更新我的答案
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2012-01-05
  • 2013-04-28
  • 2017-01-30
  • 2011-02-24
相关资源
最近更新 更多