16 진 덤프 대 xxd 형식 차이


9

역 Hexdump를 수행하는 방법을 찾고 있었고 xxd가 언급되었습니다. 그러나 단순히 다음과 같이 작동하지는 않습니다.

xxd -r hexdumpfile > binaryfile

그런 다음 xxd infileand의 출력 차이를 비교하고 hexdump infile세 가지 차이점을 발견했습니다.

  1. xxd 출력은 주소 뒤에 콜론이 있습니다
  2. xxd 출력은 데이터의 위치가 반전됩니다 (예 : 5a4216 진 덤프 출력이 425axxd 출력이 됨)
  3. 각 줄 뒤에 추가 문자가 있습니다

서버에 16 진 덤프 된 특정 파일 버전 만 있습니다. xxd를 사용하여 이진 데이터를 올바르게 다시 가져올 수 있습니까?


16 진 덤프 형식으로 취할 수 xxd의 일부 옵션을 찾고,하지만 지금은, 몇 가지 간단한 나오지 작업을 함께 할 관리되었습니다
tanon

나는 실제로 당신이 묻는 것을 정확하게 테스트하지는 않았지만 xxd -p와 -b를 시도해보십시오. 바이트 순서에 관해서는 빅 엔디안과 리틀 엔디안과 관련이 있으며 xxd는 그것을 반대로 할 수는 없지만 바이트가 파일에 저장되는 방식과 관련이 있습니다. 메모장에 텍스트 파일이있는 경우와 마찬가지로 유니 코드 16 비트 빅 엔디안, 리틀 엔디 언 또는 UTF-8 등으로 저장할 수 있으며 xxd와의 차이점을 알 수 있습니다. od 명령은 다르게 표시 될 수 있습니다.
barlop

나중에 참조 hexdump할 수 있도록 출력에 사용되는 엔디안을 선택하면이 작업이 더 간단 해집니다. (관련없는 뭔가 도움이 귀하의 질문에 발견 왜 지금?.)
jpaugh

답변:


7

내가 아는 한 가지 명령은 변환을 수행하지 않지만 쉽게 몇 단계로 나눌 수 있습니다.

  1. hexdump사용하여 출력 에서 주소 제거sed
  2. 를 사용하여 이진으로 변환 xxd
  3. 를 사용하여 엔디안 변환 (예 : 5a42가 됨 425a)dd

전체 명령은 다음과 같습니다.

sed 's/^[0-9]*//' hexdump | xxd -r -p | dd conv=swab of=binaryfile

16 진수 덤프가 0a
Smeterlink

1

이 답변은 https://stackoverflow.com/a/52834021/6770384의 게시물입니다.

하나의 sed명령으로 변환을 수행 할 수 있습니다 . 그것은 추가하는 것으로 충분 :엔디안 (어드레스 전환 후 변경 ab12하는 방법에 대해 12ab).

sed -E 's/ /: /;s/ (..)(..)/ \2\1/g;$d' dump | xxd -r

알려진 버그 (코멘트 섹션 참조)

  • 원본 파일의 길이가 홀수 인 경우 후행 null 바이트가 추가됩니다 (예 : 1, 3, 5, 7, ..., 바이트 길이).
  • 그들은 한 경우 원본 파일의 반복 부분이 제대로 복원되지 않습니다 hexdump를 사용하여 에드  *.

16 진수 덤프가 0a
Smeterlink

@Smeterlink이 관찰에 감사드립니다! 맞습니다.이 명령은 바이트 단위의 길이가 홀수 인 경우 원본 파일에없는 후행 널 바이트를 생성합니다. 나는 또 다른 버그를 발견했다. hexdump를 사용하여 반복되는 부분을 숨길 수 있습니다 *. 이 명령은 또한 이러한 부분을 올바르게 복원 할 수 없습니다. 예 : 100 대신 yes | head -n100 | hexdump | sed -E 's/ /: /;s/ (..)(..)/ \2\1/g' | xxd -r8 만 인쇄합니다 y.이 문제를 해결하려면이 1 개 이상의 라이너가 필요합니다. 나중에 다른 스크립트를 추가 할 수도 있습니다.
Socowi

*팁 주셔서 감사합니다, 몰랐어요!
Smeterlink
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.