23

Node.jsを使用してファイルがバイナリかASCIIかを確認するための最良の方法は何でしょうか?

node.jsに固有ではない2つの方法があるようです。

  1. MIMEタイプの確認:PHPでファイルがASCIIまたはバイナリであるかどうかを確認する方法-ただし、これには問題があります。たとえば、先行タスクには認識されたmimeタイプがないことが多く、mimeを使用して確認すると元に戻りますapplication/octet-stream

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

それはどのように機能しますか?通常の方法で(16進エディターを使用せずに)バイナリデータを開こうとすると、レンダリングの問題が発生し、「置換文字」と呼ばれるこの奇妙な文字の連続として解釈されます。

于 2018-04-11T11:15:01.517 に答える