컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Wednesday, April 18, 2007

파이썬 Python, 헥사 뷰어, 헥사 덤프 만들기 소스 코드; Hex Viewer, File Dumper


파이썬으로 헥사 뷰어를 만드는 소스입니다. GUI는 아니고, 그냥 콘솔에서 사용하는 간단한 것입니다. 그런데 이 코드를 테스트하면서 보니 펄보다 파이썬이 많이 느렸습니다. 똑같은 헥사 뷰어를 펄로 만들었을 때, 파이썬보다 3배 정도 빠르더군요. 같은 스크립트 언어라서 속도가 비슷할 줄 알았는데 의외였습니다.

이진 파일을 헥사로 보는 프로그램 소스 코드
스크립트 파일명: 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 # 파일 닫기



실행 결과 화면:
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>


hv.py tt.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.



참고: ▶▶ 헥사 코드 편집법 / 헥사 에디터(Hex Editor) 사용법 기초

▶▶ Perl 펄] 헥사 뷰어, 헥사 덤프 만들기 소스 코드; Hex Viewer, File Dump

2 Comments:
At July 17, 2008 at 1:54 AM, Blogger Handol said...

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:])

 
At July 17, 2008 at 8:58 AM, Blogger mwultong said...

감사합니다

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top