readstream nodejs node data node.js binary ascii

nodejs - Compruebe si un archivo es binario o ASCII con Node.js?



stream data node js (3)

Me pregunto cuál sería la mejor manera de verificar si un archivo es binario o ASCII con Node.js.

Parece que hay dos formas no específicas de node.js:

  1. Verificación del tipo MIME: cómo verificar si el archivo es ASCII o binario en PHP - sin embargo, esto tiene sus problemas, ya que, por ejemplo, los pre-procesadores a menudo no tienen un tipo de mimo reconocido y vuelven a la application/octet-stream al verificarlos usando mime

  2. A través de la comprobación del tamaño de byte usando un búfer de flujo con Cómo identificar el contenido del archivo como ASCII o binario , lo que parece bastante intensivo y aún proporciona un ejemplo de node.js.

Entonces, ¿hay otra manera ya? Tal vez una llamada o módulo de node.js secreto que no conozco? O si tengo que hacerlo yo mismo, ¿de qué manera se sugeriría?

Gracias


Gracias a los comentarios sobre esta pregunta de David Schwartz , creé istextorbinary para resolver este problema.


Vine aquí desde Google, pero como no pude encontrar una respuesta satisfactoria, adopté otro enfoque que me funciona:

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

¿Cómo funciona? Si intentas abrir datos binarios de una manera normal (sin usar un editor hexadecimal), se encontrarán algunos problemas de renderización que se traducen en una sucesión de este personaje extraño, llamado "carácter de reemplazo".


ASCII define los caracteres 0-127 , por lo que si todo el contenido de un archivo son valores de bytes en ese rango, se puede considerar un archivo 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 */});

Si el rendimiento es crítico, considere la posibilidad de escribir una función C ++ personalizada según su respuesta vinculada.