programing

bash에 공백 없이 16진수 문자만 포함된 파일의 16진수 덤프를 만드는 방법은 무엇입니까?

lovejava 2023. 5. 19. 23:53

bash에 공백 없이 16진수 문자만 포함된 파일의 16진수 덤프를 만드는 방법은 무엇입니까?

bash를 사용하여 Linux에서 이진 파일의 수정되지 않은 16진수 덤프를 만들려면 어떻게 해야 합니까?od그리고.hexdump명령은 둘 다 덤프에 공백을 삽입하며 이는 이상적이지 않습니다.

출력에서 공백이나 줄을 뺀 모든 16진수 문자로 긴 문자열을 간단하게 작성하는 방법이 있습니까?

xxd -p file

또는 모든 것을 한 줄로 연결하려는 경우:

xxd -p file | tr -d '\n'

형식 문자열은 hexdump가 원하는 대로 동작하도록 만들 수 있습니다(흰색 공간이 전혀 없음, 바이트별로).

hexdump -ve '1/1 "%.2x"'

1/1는 "각한 번 되어 한 뜻이고, 즉, " 형식은한한바소요이다니됩가트각고적되용번."다니소"▁is▁means됩요,▁",가"라는 뜻입니다."%.2x"는 printf에서와 같이 실제 형식 문자열입니다.이 경우: 2자 16진수, 더 짧으면 선행 0입니다.

의 버전의 세부 사항에 따라 달라지는 것 같습니다.odOSX에서 다음을 사용합니다.

od -t x1 -An file |tr -d '\n '

(주소 없이 16진수 형식으로 인쇄됩니다.그리고 물론 이후에 공백이 삭제되었습니다.)

Perl 한 줄기:

perl -e 'local $/; print unpack "H*", <>' file

다른 답변이 바람직하지만 순수한 Bash 솔루션의 경우 파일의 내용을 나타내는 16진수 문자의 연속 스트림을 출력할 수 있도록 답변의 스크립트를 수정했습니다. (일반 모드는 에뮬레이트함)hexdump -C.)

이 가장 버전이라고 정의된 POSIX만 ).tr그리고.od동작):

cat "$file" | od -v -t x1 -A n | tr -d ' \n'

이 기능은 다음과 같습니다.od각과 반되진는바이건않 16수다니인쇄합각.tr출력의 모든 공백 및 라인 피드를 삭제합니다. (으)로 표시됩니다. (으)로 표시됩니다.cat는 다중 으로 사용됩니다.cat 시스템을 동안에는 파일 을 기다릴 수 .od이전에 읽은 부품을 아직 처리 중입니다.을 " 일코사이는다를교수체있다할습니로음으단용자어다있니▁single습▁want▁that▁may▁replace▁with단일▁users▁core수교체할"로 바꾸기를 원할 수도 있습니다.< "$file" od ...하나의 추가 프로세스를 시작하는 것을 저장합니다.

tldr;

$ od -t x1 -A n -v <empty.zip | tr -dc '[:xdigit:]' && echo 
504b0506000000000000000000000000000000000000
$

설명:

을 합니다.od바이트를 (16진수 16진수)-t x1오프셋 () --- 주소 오프셋 없음()-A n 반복되는 "을 하지 않고 ) 및반되그 "그룹" 하지피을않고는룹복▁)않고그을▁el지▁and(-v)empty.zip표준 입력으로 리디렉션되었습니다.을 로연결프이에 파이프로 합니다.tr것(으)-d () 보어(()-c의 16진수 집합16진수 문자 집합( )'[:xdigit:]'을 인쇄할 수 .echo프롬프트를 출력과 다음 셸 프롬프트를 구분하기 위해 여기서 수행한 것처럼.

참조:

이 코드는 "순수한" 16진수 덤프 문자열을 생성하며 지정된 다른 모든 예제보다 더 빠르게 실행됩니다.이진수 0으로 채워진 1GB 파일과 모든 라인 피드에서 테스트되었습니다.데이터 콘텐츠에 종속되지 않으며 줄 대신 1MB 레코드를 읽습니다.

perl -pe 'BEGIN{$/=\1e6} $_=unpack "H*"'

수십 번의 타이밍 테스트를 통해 1GB 파일의 경우 아래와 같은 다른 방법이 더 느리다는 것을 알 수 있습니다.모든 테스트는 파일에 출력을 기록하고 체크섬으로 확인한 후 실행되었습니다.3개의 1GB 입력 파일(모든 바이트, 모든 이진 0 및 모든 LF)이 테스트되었습니다.

hexdump -ve '1/1 "%.2x"'                    #  ~10x  slower
od -v -t x1 -An | tr -d "\n "               #  ~15x  slower
xxd -p | tr -d \\n                          #   ~3x  slower
perl -e 'local \$/; print unpack "H*", <>'  # ~1.5x  slower
- this also slurps the whole file into memory

프로세스를 되돌리려면:

perl -pe 'BEGIN{$/=\1e6} $_=pack "H*",$_'

Python은 다음과 같은 용도로 사용할 수 있습니다.

python -c "print(open('file.bin','rb').read().hex())"

...어디에file.bin파일 이름입니다.

설명:

  1. 열다.file.binrb(2진수 읽기) 모드입니다.
  2. 내용 읽기(다음과 같이 반환됨)bytes반대).
  3. 사용하다bytes방법.hex()공백이나 새 줄 없이 16진수 덤프를 반환합니다.
  4. 출력을 인쇄합니다.

언급URL : https://stackoverflow.com/questions/2614764/how-to-create-a-hex-dump-of-file-containing-only-the-hex-characters-without-spac