'십육진수'에 해당되는 글 2건

  1. 2008.10.08 헥사 뷰어 만들기 예제
  2. 2008.10.08 한글 십육진수 상호 변환 예제
2008. 10. 8. 15:19

헥사 뷰어 만들기 예제

자바로, 헥사 뷰어를 만드는 소스 코드입니다. 파일을 이진모드로 열어서, 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 라는 파일로 출력 결과가 저장됩니다.

2008. 10. 8. 15:17

한글 십육진수 상호 변환 예제

자바는 기본적으로 유니코드를 사용하기에 한글을 다루기에도 편리합니다. 다음과 같은 방법을 사용하면 한글을 16진수 헥사로 상호 변환할 수 있습니다. 단, 여기서의 16진수 코드는 "유니코드 코드 번호"입니다. 한글 완성형의 16진수 코드와는 다릅니다.


한글 <-> 십육진수 바꾸기 (상호 변환)

예제 소스 파일명: Example.java
public class Example {
  public static void main(String[] args) {


    // 한글을 16진수로 변환 출력
    System.out.format("%04X%n", (int) '가');
    // 출력 결과: AC00


    // 16진수를 한글로 변환 출력
    System.out.format("%c%n", (char) 0xAC00);
    // 출력 결과: 가


    // 출력 결과를 화면이 아닌 변수에 저장하여 완전 변환 방법
    String s = String.format("%c", (char) 0xAC00);
    System.out.println(s);
    // 가

  }
}