리눅스2023. 5. 3. 10:45

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/569680

 

hexdump를 이용하면 텍스트 또는 이진(binary) 파일의 내용을 16진수로 출력할 수 있다. 우선 아래의 예시를 보자.

# my_file.txt 내용 확인
cat my_file.txt
this is a test file...

# 16진수로 출력(hexdump) - 2바이트(16비트) 단위로 해석됨에 유의
hexdump my_file.txt
0000000 6874 7369 6920 2073 2061 6574 7473 6620
0000010 6c69 2e65 2e2e 000a                   
0000017

hexdump에 아무런 옵션을 지정하지 않을 경우, 출력 내용이 2바이트(16비트) 단위로 구성되어 있음에 유의하자. 인텔 x86, AMD64는 모두 리틀-엔디안(little-endian, 작은 자리수 바이트가 주소값이 낮음) 구조이므로 파일을 읽어서 0x74 다음에 0x68이 나왔을 때 hexdump는 먼저 나온 0x74가 작은 자리수 바이트(LSB)라고 판단하여 위치를 뒤집어 출력해 준 것으로 보인다(0x7468 -> 0x6874).
 
파일의 내용을 볼 때는 그냥 1바이트씩 순서대로 출력하는 것이 더 낫다. -C 옵션을 이용하면 1바이트 단위로 16진수와 ASCII값을 나란히 출력하게 할 수 있다. 우리가 통상 hex 에디터에서 파일을 열었을 때 보던 모습이다.

# 16진수로 출력(-C 옵션, hex + ASCII)
hexdump -C my_file.txt
00000000  74 68 69 73 20 69 73 20  61 20 74 65 73 74 20 66  |this is a test f|
00000010  69 6c 65 2e 2e 2e 0a                              |ile....|
00000017

출력 형식을 직접 지정할 수도 있다. -e 옵션을 이용한다. 아래의 예시를 보자.

# 1바이트 4개씩 묶어서 출력
hexdump -e '4/1 "%02X " "\n"' my_file.txt
74 68 69 73
20 69 73 20
61 20 74 65
73 74 20 66
69 6C 65 2E
2E 2E 0A

-e 옵션의 내용을 보자면 1바이트 단위로 4개씩 묶어서(4/1) 2자리 16진수와 공백("%02X ") 형식으로 출력한 후에 줄바꿈("\n")을 출력하라는 뜻이다.

아래의 예시처럼 묶음 단위를 지정하지 않을 수도 있다.

# 1바이트씩 출력
hexdump -e '/1 "%02X "' my_file.txt
74 68 69 73 20 69 73 20 61 20 74 65 73 74 20 66 69 6C 65 2E *
0A

위의 출력 내용을 보면 0x2E가 반복되는 부분을 줄여서 아스테리스크(*)로 보여주는데, 만약 반복되는 부분도 그대로 출력하려면 -v 옵션을 추가한다.

# 1바이트씩 출력, 반복되는 부분도 그대로 출력(-v 옵션 추가)
hexdump -v -e '/1 "%02X "' my_file.txt
74 68 69 73 20 69 73 20 61 20 74 65 73 74 20 66 69 6C 65 2E 2E 2E 0A

이것 말고도 더 다양한 기능을 제공하고 있는 듯하나, 개인적으로 위에 언급한 옵션 정도만 사용하고 있다.

 

 

728x90
Posted by 반달가면