JavaScript: fileコマンドと同じ方法でバイナリかテキストか判定する
やりたいこと
fileコマンドではデータ内容から(マジックナンバーなどから)ファイルの種類が判定できる。
そのfileコマンドが使っているのと同じ方法でバイナリかテキストか判定したい。
やり方
code:ts
function* range(start, end) {
for(let i = start; i <= end; i++) {
yield i;
}
}
// Whether text or not. Besed on file (1) behavior
function isText(array) {
return array.every(e => textChars.includes(e));
}
コード内のisTextの引数のarrayはUint8Arrayを期待している。
実装の説明
code:py
textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f})
is_binary_string = lambda bytes: bool(bytes.translate(None, textchars))
上記の実装を解釈したところ、
textcharsでバイト値を列挙して、translateで判定したいバイト列に含まれるtextcharsを削除している。bool()はバイト列が空でないならTrueになるはず。
JavaScriptの実装ではパフォーマンスを考え、置換ではなくeveryと.includeで全てのバイト列がtextCharsで構成されているかを使って判定するようにしている。