使用Node.js检查文件是二进制文件还是ASCII文件?

使用Node.js检查文件是二进制文件还是ASCII文件?,node.js,binary,ascii,Node.js,Binary,Ascii,我想知道使用Node.js检查文件是二进制文件还是ASCII文件的最佳方法是什么 似乎有两种方法不是node.js特有的: 检查MIME类型:-但是这也有问题,例如前置程序通常没有可识别的MIME类型,在使用 通过使用流缓冲区检查字节大小-这似乎相当密集,但提供了node.js示例 那么已经有别的办法了吗?可能是我不知道的秘密node.js调用或模块?或者,如果我必须自己做这件事,会有什么建议 谢谢,因此如果文件的全部内容都是该范围内的字节值,则可以将其视为ASCII文件 函数fileIsAsc

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

似乎有两种方法不是node.js特有的:

  • 检查MIME类型:-但是这也有问题,例如前置程序通常没有可识别的MIME类型,在使用

  • 通过使用流缓冲区检查字节大小-这似乎相当密集,但提供了node.js示例

  • 那么已经有别的办法了吗?可能是我不知道的秘密node.js调用或模块?或者,如果我必须自己做这件事,会有什么建议

    谢谢,因此如果文件的全部内容都是该范围内的字节值,则可以将其视为ASCII文件

    函数fileIsAscii(文件名,回调){
    //读取未编码的文件以进行原始缓冲区访问。
    require('fs').readFile(文件名,函数(err,buf){
    如果(错误)抛出错误;
    var isAscii=真;
    对于(vari=0,len=buf.length;i127){isAscii=false;break;}
    }
    回调(isAscii);//如果所有八位字节都在[0127]中,则为true。
    });
    }
    fileIsAscii('/usr/share/dict/words',函数(x){/*x===true*/});
    fileIsAscii('/bin/ls',函数(x){/*x===false*/});
    

    如果性能很关键,那么考虑一下你的链接答案写一个自定义的C++函数。

    < P>由于我对这个问题的评论,我创建了这个问题。

    < P>我是从谷歌来的,但是因为我找不到满意的答案,我采取了另一种对我有用的方法:

    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");
    }
    

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

    你能定义一下“二进制文件”是什么意思吗?测试的方式完全取决于你的意思,并且没有一个公认的定义。比如说一个图像,或者更具体地说,任何不是文本的东西。对不起!这还不够具体。你打算如何处理这些信息?(检查前8KB的非ASCII字符是否足够?)。问题是似乎有几种方法,但我不确定如何将它们移植到Node.js。你的建议似乎很好,所以我很乐意接受一个代码示例可以提供如何——因为文档不清楚你如何执行这样的检查(那些字节是ASCII还是不)。如果高清晰,你可以考虑字节ASCII。但对于UTF-8或Unicode等,你可能会(或可能不会)考虑文本。你确实需要提供一个“文本”和“二进制”的精确定义,或者你需要记录你的用例,这样我们就可以找到正确的定义。如果你的意图是真正地识别文本文件而不是ASCII编码,那么考虑更新你的问题。因此,您不必维护太多。无论如何,istextorbinary现在是Javascript,这是一些编辑器和浏览器将二进制文件显示为文本的唯一方式。保存从文件中读取的二进制数据的js字符串本身(除非您是从textarea获取它,或者从任何文本对象获取它)将只具有0-255之间的值,而不会具有ufffd。Firefox不会转换为相同的字符。它使用一种特殊的字体来显示字符代码值。当您使用utf-8从某个位置抓取带有特定字符的文本,然后尝试在使用缺少这些字符的旧代码页的页面中使用它时,也会出现这种字符替换。因此,它不一定表示二进制。如何将二进制解码为图像?我很难做到这一点,下面是我的问题的链接。