텍스트 파일이 바이너리로 표시되는 데 문제가 있습니다.

텍스트 파일이 바이너리로 표시되는 데 문제가 있습니다.

출력으로 텍스트 파일을 생성하는 실행 파일이 있습니다. 문제는 텍스트 파일이 일종의 바이너리 파일 플래그와 함께 나온다는 것입니다. 결과는 다음과 같습니다.

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

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

일부 읽기에 따르면 grep은 처음 1000바이트 정도에서 널 문자를 찾은 다음 파일이 '바이너리'인지 여부를 결정하므로 내 질문은 두 가지입니다.

  1. -a 플래그 없이 grep이 올바르게 작동하는지 확인하기 위해 파일에서 널 문자를 제거하는 쉬운 방법이 있습니까(후처리의 일부로 이 작업을 수행할 수 있음)?

  2. 널 문자가 파일에 기록되는 것을 방지하기 위해 내 코드에서 찾아야 할 확실한 사항이 있습니까? 코드를 아주 철저하게 살펴보았는데 확실한 범인은 보이지 않습니다.

    .

답변1

적어도 첫 번째 질문에는 답할 수 있습니다. Unix/Linux를 사용하는 경우 tr을 사용할 수 있습니다.

tr -d '\000' < filein > fileout

여기서 \000은 널 문자입니다. 여기 예제에서 볼 수 있듯이 인쇄할 수 없는 모든 문자를 제거할 수도 있습니다."유닉스 텍스트 편집: sed, tr, cut, od, awk"

두 번째 질문에 관해서는 귀하의 프로그래밍 언어가 무엇인지 모르지만 출력 파일에 인쇄될 수 있는 초기화되지 않은 변수를 검색하겠습니다.

답변2

추측을 해보겠습니다....

프로그램은 각 문자에 2바이트를 사용하는 유니코드 인코딩인 UTF-16으로 파일을 작성합니다. 모든 두 번째 바이트는 대부분의 경우 null입니다.

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

대부분의 coreutil이 편한 UTF-8로 변환합니다.

답변3

또 다른 옵션은 다음과 같습니다.문자열실제로 인코딩이나 널 문자를 "수정"하는 것보다 훨씬 더 강력한 도구인 이 도구는 실제 바이너리에서 텍스트 데이터를 가져올 수 있으므로

$ 문자열 출력_파일.txt | grep "그렙 문자열"

일반적으로 바이너리 파일에서 무언가를 빠르게 찾는 데 매우 편리합니다. 예:

$ 문자열 펌웨어.bin | grep 버전

관련 정보