'헥사'에 해당되는 글 1건
- 2008.10.08 헥사 뷰어 만들기 예제
헥사 뷰어 만들기 예제
자바로, 헥사 뷰어를 만드는 소스 코드입니다. 파일을 이진모드로 열어서, 16바이트씩 읽어 헥사(16진수)로 변환한 후, 출력합니다.
복잡한 기능은 없고 최대한 간단하게 만든 것입니다. 헥사 뷰어라는 것은, 이상하게도, 조그만 기능 하나만 추가해도, 상당히 복잡하게 되는 측면이 있습니다.
헥사 뷰어 만들기 소스 코드
소스 파일명: Example.java
버전 0.8
(※ 스크롤 박스 사용법: 박스 안을 마우스로 클릭한 후, 키보드의 좌우 화살표키를 누르면 양옆으로 움직일 수 있습니다. 박스에서 다시 나오려면, 박스 바깥의 아무곳이나 클릭하면 됩니다.)
import java.io.*;
public class Example {
public static void main(String[] args) throws IOException {
if (args.length == 0) { // args.length 는 옵션 개수
System.err.println("Input Filename...");
System.exit(1); // 읽을 파일명을 주지 않았을 때는 종료
}
byte[] buf16 = new byte[16]; // 헥사 값이 16바이트씩, 즉, 한줄씩 저장될 버퍼
int offset = 0; // 번지
int buf16Len; // 한줄에 들어있는 헥사 값의 개수, 즉, 길이
DataInputStream in = new DataInputStream(new FileInputStream(args[0]));
while ((buf16Len = in.read(buf16)) > 0) {
System.out.format("%08X: ", offset); // Offset (번지) 출력
// 헥사 구역의 헥사 값 16개 출력 (8개씩 2부분으로)
for (int i = 0; i < buf16Len; i++) {
if (i == 8) System.out.print(" "); // 8개씩 분리
System.out.format("%02X ", buf16[i]); // 헥사 값 출력
}
// 한 줄이 16 바이트가 되지 않을 때, 헥사 부분과 문자 부분 사이에 공백들 삽입
for (int i = 0; i <= (16 - buf16Len) * 3; i++)
System.out.print(" ");
if (buf16Len < 9) System.out.print(" "); // 한줄이 9바이트보다 적을 때는 한칸 더 삽입
// 문자 구역 출력
for (int i = 0; i < buf16Len; i++) {
if (buf16[i] >= 0x20 && buf16[i] <= 0x7E) // 특수 문자 아니면 출력
System.out.format("%c", buf16[i]);
else System.out.print("."); // 특수문자, 그래픽문자 등은 마침표로 출력
}
offset += 16; // 번지 값을 16 증가
System.out.println(); // 줄바꿈
}
if (offset == 0) System.out.format("%08X: ", offset); // 0바이트 파일일 경우 처리
in.close();
}
}
컴파일 및 실행 결과 화면:
D:\Z>javac Example.java
D:\Z>java Example
Input Filename...
D:\Z>java Example test.bin
00000000: 4D 5A 90 20 03 20 20 20 04 20 20 20 FF FF 20 20 MZ. . . ..
00000010: B8 20 20 20 20 20 20 20 40 20 20 20 20 20 20 20 . @
00000020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00000030: 20 20 20 20 20 20 20 20 20 20 20 20 D0 20 20 20 .
00000040: 0E 1F BA 0E 20 B4 09 CD 21 B8 01 4C CD 21 54 68 .... ...!..L.!Th
00000050: 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
00000060: 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
00000070: 6D 6F 64 65 2E 0D 0D 0A 24 20 20 20 20 20 20 20 mode....$
00000080: 64 C7 F9 7C 20 A6 97 2F 20 A6 97 2F 20 A6 97 2F d..| ../ ../ ../
00000090: E3 A9 CA 2F 23 A6 97 2F 20 A6 96 2F 77 A6 97 2F .../#../ ../w../
000000A0: 07 60 EA 2F 30 A6 97 2F 07 60 FA 2F 49 A6 97 2F .`./0../.`./I../
000000B0: 07 60 F9 2F 02 A6 97 2F 07 60 EF 2F 21 A6 97 2F .`./.../.`./!../
000000C0: 52 69 63 68 20 A6 97 2F 20 20 20 20 20 20 20 20 Rich ../
000000D0: 50 45 20 20 4C 01 03 20 B8 E3 22 46 20 20 20 20 PE L.. .."F
000000E0: 20 20 20 20 E0 20 03 01 0B 01 08 20 20 B0 20 20 . ..... .
000000F0: 20 50 20 20 20 20 20 20 CF 1C 20 20 20 10 20 20 P .. .
00000100: 20 C0 20 20 20 20 40 20 20 10 20 20 20 10 20 20 . @ . .
00000110: 04 20 20 20 20 20 20 20 04 20 20 20 20 20 20 20 . .
00000120: 20 10 01 20 20 10 20 20 20 20 20 20 03 20 20 20 .. . .
00000130: 20 20 10 20 20 10 20 20 20 20 10 20 20 10 20 20 . . . .
00000140: 20 20 20 20 10 20 20 20 20 20 20 20 20 20 20 20 .
00000150: 94 D8 20 20 28 20 20 20 20 20 20 20 20 31 31 31 .. ( 111
00000160: 30 0
D:\Z>
D:\Z>java Example test.bin > out.txt
D:\Z>
java Example test.bin > out.txt
이렇게 하면 out.txt 라는 파일로 출력 결과가 저장됩니다.