23

我想知道使用 Node.js 检查文件是二进制文件还是 ASCII 文件的最佳方法是什么?

似乎有两种方式不特定于 node.js:

  1. 检查 MIME 类型:How to Check if File is ASCII or Binary in PHP - 但是这有它的问题,例如前驱通常没有可识别的 mime 类型,并application/octet-stream在使用mime检查它们时恢复

  2. 通过使用流缓冲区检查字节大小以及如何将文件内容识别为 ASCII 或二进制- 这似乎非常密集,并且还提供了一个 node.js 示例。

那么已经有另一种方法了吗?也许是我不知道的秘密 node.js 调用或模块?或者如果我必须自己这样做,会建议什么方式?

谢谢

4

3 回答 3

12

感谢David Schwartz对这个问题的评论,我创建了istextorbinary来解决这个问题。

于 2012-04-30T23:16:21.547 回答
5

ASCII 定义字符 0-127,因此如果文件的全部内容是该范围内的字节值,则可以将其视为 ASCII 文件。

function fileIsAscii(filename, callback) {
  // Read the file with no encoding for raw buffer access.
  require('fs').readFile(filename, function(err, buf) {
    if (err) throw err;
    var isAscii = true;
    for (var i=0, len=buf.length; i<len; i++) {
      if (buf[i] > 127) { isAscii=false; break; }
    }
    callback(isAscii); // true iff all octets are in [0, 127].
  });
}
fileIsAscii('/usr/share/dict/words', function(x){/* x === true */});
fileIsAscii('/bin/ls', function(x){/* x === false */});

如果性能至关重要,则考虑根据您的链接答案编写自定义 C++ 函数。

于 2012-04-28T05:18:37.690 回答
2

我从谷歌来到这里,但由于找不到满意的答案,我采取了另一种对我有用的方法:

const string_to_test = "I am just a piece of text";
//const binary_to_test = "��˰!1�H��1�1����!H�=u�!�";
if(/\ufffd/.test(string_to_test) === true){
    console.log("I'm 'binary'");
}else{
    console.log("I'm proper text");
}

它是如何工作的?如果您尝试以正常方式打开二进制数据(不使用十六进制编辑器),它会遇到一些渲染问题,这些问题会将您转换为这个奇怪的字符的连续 - 称为“替换字符”。

于 2018-04-11T11:15:01.517 回答