Tengo problemas con un archivo de texto marcado como binario

Tengo problemas con un archivo de texto marcado como binario

Tengo un ejecutable que genera un archivo de texto como salida. El problema es que el archivo de texto aparece con algún tipo de indicador de archivo binario. El resultado es algo como esto:

$ grep "grep string" output_file.txt
Binary file output_file.txt matches.

$ grep -a "grep string" output_file.txt
[correct results]

Algunas lecturas han indicado que grep busca un carácter nulo en los primeros mil bytes aproximadamente, y luego determina a partir de ahí si un archivo es "binario" o no, por lo que mi pregunta es doble:

  1. ¿Existe una manera fácil de eliminar los caracteres nulos de mis archivos (puedo hacer esto como parte de mi posprocesamiento) para garantizar que grep funcione correctamente sin el indicador -a?

  2. ¿Hay algo obvio que deba buscar en mi código para evitar que se escriban caracteres nulos en el archivo? Revisé el código bastante detenidamente y no veo ningún culpable obvio.

    .

Respuesta1

Puedo responder al menos a la primera pregunta. Si estás usando Unix/Linux puedes usar tr

tr -d '\000' < filein > fileout

donde \000 es el carácter nulo. También puedes eliminar todos los caracteres no imprimibles como puedes ver en el ejemplo aquí:"Edición de texto Unix: sed, tr, cut, od, awk"

Con respecto a su segunda pregunta, no sé cuál es su lenguaje de programación, pero buscaría variables no inicializadas que podrían terminar de imprimirse en el archivo de salida.

Respuesta2

Voy a hacer una suposición....

Su programa escribe el archivo en UTF-16, una codificación Unicode que utiliza dos bytes para cada carácter. Cada segundo byte es, la mayoría de las veces, nulo.

iconv -f utf-16 -t utf-8 < filein > fileout

lo convertirá a UTF-8, con el que la mayoría de los coreutils se sienten cómodos.

Respuesta3

Otra opción podría ser usarinstrumentos de cuerdaherramienta, que en realidad es incluso más poderosa que simplemente "arreglar" codificación o caracteres nulos, puede recuperar datos de texto de cualquier binario real, por lo que

$ cadenas archivo_salida.txt | grep "cadena grep"

suele ser bastante útil para encontrar rápidamente algo en un archivo binario, por ejemplo

$ cadenas firmware.bin | VERSIÓN grep

información relacionada