바이너리 파일의 내용을 어떻게 되돌리나요?

바이너리 파일의 내용을 어떻게 되돌리나요?

나는 문제를 해결하고 있었는데, 나는 다음과 같은 것을 발견했습니다.데이터 파일파일 확장자가 없습니다. 명령은 file그것이 임을 보여 줍니다 data file (application/octet-stream).hd국민 총생산.마지막 줄에. 따라서 이 파일을 반대로 하면 다음과 같은 결과를 얻게 됩니다..PNG형식 파일을 찾기 위해 모든 곳을 검색했지만 바이너리 파일의 내용을 되돌리는 방법을 설명하는 솔루션을 찾지 못했습니다.

답변1

xxd(에서 vim) 및 tac(GNU coreutils에서, tail -r일부 시스템에서도)를 사용하십시오 .

< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png

답변2

In zsh(내부적으로 이진 데이터를 처리할 수 있는 유일한 셸입니다(고려하고 싶지 않은 경우).ksh93의 base64 인코딩)):

zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
  • LC_ALL=C: 문자는 바이트입니다.
  • $mapfile[file.gnp]file.gnp:문서 내용
  • s::: 문자열을 바이트 구성 요소로 분할합니다.
  • Oa: O역방향 정렬 배열 첨자a

답변3

펄 사용:

perl -0777pe '$_=reverse $_'  [input_file]

성능 시험:

dd if=/dev/urandom of=/tmp/a bs=1M count=1
LC_ALL=C tac -rs $'.\\|\n' /tmp/a > /tmp/r

time perl -0777pe '$_=reverse $_' /tmp/a         | diff -q - /tmp/r
time xxd -p -c1 /tmp/a | tac | xxd -p -r         | diff -q - /tmp/r
time perl -0777 -F -ape '$_=reverse@F' /tmp/a    | diff -q - /tmp/r
time LC_ALL=C tac -rs $'.\\|\n' /tmp/a           | diff -q - /tmp/r

결과:

  • 로컬 테스트: 내 솔루션은 가장 빠르 perl -0777 -F면서도 가장 느립니다.
  • 테스트 대상온라인으로 사용해 보세요!: 내 솔루션은 가장 빠르고 xxd가장 느립니다.

참고: 모든 솔루션의 실행 시간은 diff출력과 동일해야 합니다.

답변4

나는 다음을 시도했다:

tac -rs '.' input.gnp > output.png

아이디어는 "tac"이 모든 문자를 구분 기호로 사용하도록 강제하는 것입니다. 바이너리에서 시도해 보았는데 작동하는 것 같습니다. 확인을 해 주시면 대단히 감사하겠습니다.

가장 큰 장점은 파일을 메모리에 로드하지 않는다는 것입니다.

관련 정보