Wednesday, April 18, 2007
Python 파이썬] 헥사 뷰어, 헥사 덤프 만들기 소스 코드; Hex Viewer, File Dumper
파이썬으로 헥사 뷰어를 만드는 소스입니다. GUI는 아니고, 그냥 콘솔에서 사용하는 간단한 것입니다. 그런데 이 코드를 테스트하면서 보니 펄보다 파이썬이 많이 느렸습니다. 똑같은 헥사 뷰어를 펄로 만들었을 때, 파이썬보다 3배 정도 빠르더군요. 같은 스크립트 언어라서 속도가 비슷할 줄 알았는데 의외였습니다.
이진 파일을 헥사로 보는 프로그램 소스 코드
스크립트 파일명: hv.py
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
실행 결과 화면:
옆으로스크롤가능
hv.py tt.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.
참고로 위에서 tt.bin 이라는 것은 테스트용의 아무 파일입니다.
참고: ▶▶ 헥사 코드 편집법 / 헥사 에디터(Hex Editor) 사용법 기초
▶▶ Perl 펄] 헥사 뷰어, 헥사 덤프 만들기 소스 코드; Hex Viewer, File Dump
이진 파일을 헥사로 보는 프로그램 소스 코드
스크립트 파일명: hv.py
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
#!/usr/bin/python
# -*- coding: cp949 -*-
import sys
if len(sys.argv) is 1:
print >> sys.stderr, '읽을 파일명을 입력해 주세요'
exit(1)
try:
IN = open(sys.argv[1], 'rb') # 파일 오픈
except IOError:
print >> sys.stderr, '그런 파일이 없거나, 열기 에러입니다.'
exit(1)
offset = 0 # 번지 변수 초기화
while True: # 무한 루프
buf16 = IN.read(16) # 파일을 16바이트씩 읽어 버퍼에 저장
buf16Len = len(buf16) # 버퍼의 실제 크기 알아내기
if buf16Len == 0: break
output = "%08X: " % (offset) # Offset(번지)을, 출력 버퍼에 쓰기
for i in range(buf16Len): # 헥사 부분의 헥사 값 16개 출력 (8개씩 2부분으로)
if (i == 8): output += " " # 8개씩 분리
output += "%02X " % (ord(buf16[i])) # 헥사 값 출력
for i in range( ((16 - buf16Len) * 3) + 1 ): # 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
output += " "
if (buf16Len < 9):
output += " " # 한줄이 9바이트보다 적을 때는 한칸 더 삽입
for i in range(buf16Len): # 문자 구역 출력
if (ord(buf16[i]) >= 0x20 and ord(buf16[i]) <= 0x7E): # 특수 문자 아니면 그대로 출력
output += buf16[i]
else: output += "." # 특수문자, 그래픽문자 등은 마침표로 출력
offset += 16 # 번지 값을 16 증가
print output # 1행 분량의 헥사 덤프 문자열이 든 버퍼를 출력
if (offset == 0):
print "%08X: " % (offset) # 0바이트 파일일 경우 처리
IN.close # 파일 닫기
# -*- coding: cp949 -*-
import sys
if len(sys.argv) is 1:
print >> sys.stderr, '읽을 파일명을 입력해 주세요'
exit(1)
try:
IN = open(sys.argv[1], 'rb') # 파일 오픈
except IOError:
print >> sys.stderr, '그런 파일이 없거나, 열기 에러입니다.'
exit(1)
offset = 0 # 번지 변수 초기화
while True: # 무한 루프
buf16 = IN.read(16) # 파일을 16바이트씩 읽어 버퍼에 저장
buf16Len = len(buf16) # 버퍼의 실제 크기 알아내기
if buf16Len == 0: break
output = "%08X: " % (offset) # Offset(번지)을, 출력 버퍼에 쓰기
for i in range(buf16Len): # 헥사 부분의 헥사 값 16개 출력 (8개씩 2부분으로)
if (i == 8): output += " " # 8개씩 분리
output += "%02X " % (ord(buf16[i])) # 헥사 값 출력
for i in range( ((16 - buf16Len) * 3) + 1 ): # 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
output += " "
if (buf16Len < 9):
output += " " # 한줄이 9바이트보다 적을 때는 한칸 더 삽입
for i in range(buf16Len): # 문자 구역 출력
if (ord(buf16[i]) >= 0x20 and ord(buf16[i]) <= 0x7E): # 특수 문자 아니면 그대로 출력
output += buf16[i]
else: output += "." # 특수문자, 그래픽문자 등은 마침표로 출력
offset += 16 # 번지 값을 16 증가
print output # 1행 분량의 헥사 덤프 문자열이 든 버퍼를 출력
if (offset == 0):
print "%08X: " % (offset) # 0바이트 파일일 경우 처리
IN.close # 파일 닫기
실행 결과 화면:
옆으로스크롤가능
D:\Z>hv.py
읽을 파일명을 입력해 주세요
D:\Z>hv.py tt.bin
00000000: 74 61 00 00 00 00 00 00 00 00 00 00 18 00 00 00 ta..............
00000010: 50 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 P...............
00000020: 40 10 30 40 2E 64 65 62 75 67 24 46 00 00 00 00 @.0@.debug$F....
00000030: 00 00 00 00 10 00 00 00 68 06 00 00 78 06 00 00 ........h...x...
00000040: 00 00 00 00 01 00 00 00 40 10 10 42 20 20 20 2F ........@..B /
00000050: 44 45 46 41 55 4C 54 4C 49 42 3A 22 4C 49 42 43 DEFAULTLIB:"LIBC
00000060: 4D 54 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A MT" /DEFAULTLIB:
00000070: 22 4F 4C 44 4E 41 4D 45 53 22 20 02 00 00 00 12 "OLDNAMES" .....
00000080: 00 09 00 00 00 00 00 0B 44 3A 5C 5A 5C 68 76 2E ........D:\Z\hv.
00000090: 6F 62 6A 38 00 13 10 01 22 00 00 07 00 0E 00 00 obj8....".......
000000A0: 00 27 C6 0E 00 00 00 27 C6 21 4D 69 63 72 6F 73 .'.....'.!Micros
000000B0: 6F 66 74 20 28 52 29 20 4F 70 74 69 6D 69 7A 69 oft (R) Optimizi
000000C0: 6E 67 20 43 6F 6D 70 69 6C 65 72 00 00 83 EC 18 ng Compiler.....
000000D0: A1 00 00 00 00 33 C4 89 44 24 14 8B 44 24 1C 53 .....3..D$..D$.S
000000E0: 68 00 00 00 00 50 8D 44 24 0C 50 33 DB E8 00 00 h....P.D$.P3....
000000F0: 00 00 83 C4 0C 85 C0 74 29 E8 00 00 00 00 83 C0 .......t).......
00000100: 40 50 68 00 00 00 00 E8 00 00 00 00 83 C4 08 8D @Ph.............
00000110: 43 01 5B 8B 4C 24 14 33 CC E8 00 00 00 00 83 C4 C.[.L$.3........
00000120: 18 C3 8B 4C 24 04 57 51 6A 10 8D 54 24 14 6A 01 ...L$.WQj..T$.j.
00000130: 52 E8 00 00 00 00 8B F8 83 R........
D:\Z>
D:\Z>
D:\Z>hv.py tt.bin > out.txt
D:\Z>
읽을 파일명을 입력해 주세요
D:\Z>hv.py tt.bin
00000000: 74 61 00 00 00 00 00 00 00 00 00 00 18 00 00 00 ta..............
00000010: 50 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 P...............
00000020: 40 10 30 40 2E 64 65 62 75 67 24 46 00 00 00 00 @.0@.debug$F....
00000030: 00 00 00 00 10 00 00 00 68 06 00 00 78 06 00 00 ........h...x...
00000040: 00 00 00 00 01 00 00 00 40 10 10 42 20 20 20 2F ........@..B /
00000050: 44 45 46 41 55 4C 54 4C 49 42 3A 22 4C 49 42 43 DEFAULTLIB:"LIBC
00000060: 4D 54 22 20 2F 44 45 46 41 55 4C 54 4C 49 42 3A MT" /DEFAULTLIB:
00000070: 22 4F 4C 44 4E 41 4D 45 53 22 20 02 00 00 00 12 "OLDNAMES" .....
00000080: 00 09 00 00 00 00 00 0B 44 3A 5C 5A 5C 68 76 2E ........D:\Z\hv.
00000090: 6F 62 6A 38 00 13 10 01 22 00 00 07 00 0E 00 00 obj8....".......
000000A0: 00 27 C6 0E 00 00 00 27 C6 21 4D 69 63 72 6F 73 .'.....'.!Micros
000000B0: 6F 66 74 20 28 52 29 20 4F 70 74 69 6D 69 7A 69 oft (R) Optimizi
000000C0: 6E 67 20 43 6F 6D 70 69 6C 65 72 00 00 83 EC 18 ng Compiler.....
000000D0: A1 00 00 00 00 33 C4 89 44 24 14 8B 44 24 1C 53 .....3..D$..D$.S
000000E0: 68 00 00 00 00 50 8D 44 24 0C 50 33 DB E8 00 00 h....P.D$.P3....
000000F0: 00 00 83 C4 0C 85 C0 74 29 E8 00 00 00 00 83 C0 .......t).......
00000100: 40 50 68 00 00 00 00 E8 00 00 00 00 83 C4 08 8D @Ph.............
00000110: 43 01 5B 8B 4C 24 14 33 CC E8 00 00 00 00 83 C4 C.[.L$.3........
00000120: 18 C3 8B 4C 24 04 57 51 6A 10 8D 54 24 14 6A 01 ...L$.WQj..T$.j.
00000130: 52 E8 00 00 00 00 8B F8 83 R........
D:\Z>
D:\Z>
D:\Z>hv.py tt.bin > out.txt
D:\Z>
hv.py tt.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.
참고로 위에서 tt.bin 이라는 것은 테스트용의 아무 파일입니다.
참고: ▶▶ 헥사 코드 편집법 / 헥사 에디터(Hex Editor) 사용법 기초
▶▶ Perl 펄] 헥사 뷰어, 헥사 덤프 만들기 소스 코드; Hex Viewer, File Dump
tag: python
Python | 파이썬
hex.py 잘 가져다 씁니다.
python이 perl에 비해 크게 느리지는 않을 것입니다.
현재 코드를 개선할려면 map(), join()을 사용해 보시기 바랍니다.
def conv2hexstr(val):
return "%02X" % (ord(val))
def conv2hexArray(valarray):
hexstrarr = map(conv2hexstr, valarray)
return ' '.join(hexstrarr)
output += conv2hexArray(buf16[:8])
if buf16Len > 8:
output += " "
output += conv2hexArray(buf16[8:])
감사합니다
<< Home