Estou tendo problemas com um arquivo de texto sendo marcado como binário

Estou tendo problemas com um arquivo de texto sendo marcado como binário

Eu tenho um executável que gera um arquivo de texto como saída. O problema é que o arquivo de texto sai com algum tipo de sinalizador de arquivo binário. O resultado é algo assim:

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

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

Algumas leituras indicaram que grep procura um caractere nulo nos primeiros mil bytes e depois determina se um arquivo é 'binário' ou não, então minha pergunta é dupla:

  1. Existe uma maneira fácil de remover caracteres nulos dos meus arquivos (posso fazer isso como parte do meu pós-processamento) para garantir que o grep funcione corretamente sem o sinalizador -a?

  2. Há algo óbvio que devo procurar em meu código para evitar que caracteres nulos sejam gravados no arquivo? Examinei o código detalhadamente e não vejo nenhum culpado óbvio.

    .

Responder1

Posso responder pelo menos à primeira pergunta. Se você estiver usando Unix/Linux você pode usar tr

tr -d '\000' < filein > fileout

onde \000 é o caractere nulo. Você também pode remover todos os caracteres não imprimíveis, como pode ver no exemplo aqui:"Edição de texto Unix: sed, tr, cut, od, awk"

Em relação à sua segunda pergunta, não sei qual é a sua linguagem de programação, mas procuraria por variáveis ​​​​não inicializadas que poderiam acabar sendo impressas no arquivo de saída.

Responder2

vou dar um palpite....

Seu programa grava o arquivo em UTF-16, uma codificação Unicode que usa dois bytes para cada caractere. Cada segundo byte é, na maioria das vezes, nulo.

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

irá convertê-lo para UTF-8, com o qual a maioria dos coreutils se sente confortável.

Responder3

Outra opção poderia ser usarcordasferramenta, que na verdade é ainda mais poderosa do que apenas "consertar" codificação ou caracteres nulos, ela pode buscar dados de texto de qualquer binário real, então

$ strings arquivo_de_saída.txt | grep "string grep"

geralmente é bastante útil para encontrar rapidamente algo em um arquivo binário, por exemplo

$ strings firmware.bin | grep VERSÃO

informação relacionada