반응형

Class 파일의 버젼을 알아보는 방법에 대해 공부해 보도록 하겠다.
가끔 배치작업 또는 모듈제공등의 업무를 회사에서 할때에 이러한 케이스를 별도로 알아두고
작업하는것이 편하다.

예전에 보고 안봐서 잠시 까먹었었는데 이번기회에 제대로 정리를 해보도록 하겠다.

[서론]
java file -> class 파일의 확장자로 변경하게 되면 compiler가 compile이란 과정을 거치게 된다.
이떄 class file앞에 헤더를 붙이게 되는데 우리가 육안으로 알아보기 힘든 binary데이터와 hex데이터의  조합으로 이것저것 뒤섞여 버린다.이런놈의 버젼을 알아보는 방법에 대해 알아보도록 하자

[ 본론 ]
우선 아래 코드를 참조하자. developer들이 개발을 할때에 major한 부분을 개발하는 사람이 있고 minor한 버젼의 서브 프로젝트를 할떄가 있다. 따라서 하나의 배포판은 major버젼과 minor버젼의 합이라고 할수 있다. jdk 를 만드는 프로젝트 역시 sun사에서 2개로 나누어서 개발을 한다. 그 개발배포 버젼정보는 아래와 같다.

major  minor     version
45         3           1.0
45         3           1.1
46         0           1.2
47         0           1.3
48         0           1.4
49         0           1.5
50         0           1.6


위의 값은 버젼별로 major와 minor 버젼까지 알려준다.

그럼 class 파일을 하나 까보도록 하자 . hex 로 view를 해줄수 있는 울트라 에디터와 같은 좋은 툴이 있다면 class를 까볼수 있다.

해당 .class파일을 에디터로 열어보면 맨앞줄의 헤더정보는 아래와 같다.

0000000h : CA FE BA BE 00 00 00 30 00 BC 07 ~~~~

위 정보중에서 우리가 알아야 할정보는 영어 뒤에 값이다. HEX 값이기 때문에 저걸 10진수로 바꾸면
기본 헤더정보인 CA FE BA BE 뒤에 버젼정보가 온다는것을 알수가 있다.

00 00 | 00 30 이다. 마지막에 오는 30이 바로 version정보이다. 30은 hex코드이기 때문에 이것을 10진수로 변환하면 48이 된다. 이 48은 major 버젼의 정보가 되어 해당 파일은 1.4로 컴파일된 .class 파일인것을 알수 있다.

참조로 아래 표를 보자

00 00 | 00 30
minor   major  정보이다.

앞에 minor은 0이 되고 뒤에 major은 30을 10진수로 바꾼 48이 된다.

따라서 저놈은 버젼이 1.4인 것이다. 끝!!ㅋㅋㅋ

저걸 일일이 열어보려면 좀 짱난다.

아래 소스는 컴파일된 정보를 알아볼수 있도록 한 java 소스이다.

 import java.io.*;

public class ClassVersionChecker {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < args.length; i++)
            checkClassVersion(args[i]);
    }

    private static void checkClassVersion(String filename)
        throws IOException
    {
        DataInputStream in = new DataInputStream
         (new FileInputStream(filename));

        int magic = in.readInt();
        if(magic != 0xcafebabe) {
          System.out.println(filename + " is not a valid class!");;
        }
        int minor = in.readUnsignedShort();
        int major = in.readUnsignedShort();
        System.out.println(filename + ": " + major + " . " + minor);
        in.close();
    }
}




해당 소스를 보면 별거 없다. ㅋㅋ

실행하면 아래와 같은 결과가 나온다.

 > java ClassVersionChecker ClassVersionChecker.class
ClassVersionChecker.class: 49 . 0


이렇게 class 파일에 대한 정보를 알아 보는 방법에 대해서 몇자 끄적대보았다.

참조한 사이트 : http://www.rgagnon.com/javadetails/java-0544.html

이제 나이도 있는데

영어로 번역된 사이트를 참조하도록 하자. ㅋ

반응형

'Program > JAVA' 카테고리의 다른 글

JAVA - LINUX 명령어 실행하는 방법  (0) 2010.02.06
자바 메일 강의자료 Sendmail  (0) 2010.01.27
String Class 사용시 주의사항  (2) 2010.01.21
자바 특별한 Exception  (0) 2010.01.11
메모리 릭에 대해 글쓰는중 ver1  (0) 2009.11.13
반응형
Mysql 프로시져

(1) list 보기0
mysql> SHOW PROCEDURE STATUS
(2) procedure 세부정보보기
mysql> show create procedure [프로시져명]
(3) found_rows() 보기
SELECT FOUND_ROWS()


▷ Mysql Query 결과를 파일로 쓰는방법


 $mysql -u 유저명 -p DB명 -e "쿼리" -t > 저장할 파일명
 (-t 옵션을 뺄경우 각 필드가 탭으로 구분되어 저장됨 )
반응형

'DB > Maria & Mysql' 카테고리의 다른 글

[ MYSQL 유용한 함수 ]  (0) 2010.07.09
[Mysql Paging Query]  (3) 2010.07.02
Mysql Character Set 변경방법  (0) 2010.06.16
Mysql 원격접속 허용 설정하기  (0) 2010.06.04
Mysql 계정 생성 방법 기술  (0) 2010.06.04
반응형


[ 서론 ]

Base64인코딩은 말그대로 문자열을 인코딩하기위해 사용되는 방식이다. 좀더 쉽게 설명하자면 Base64 인코딩은 64개의문자를 이용하여 Binary 데이터를 ASCII 텍스트 데이터로 표현하기 위해 사용되는것이다.
암호학과 전혀 관련이 없는것이지만 암호화에서 많이사용한다. 그이유는 우리가 말하는 암호학의 여러 방법들은 대게 byte단위로 암호화 된다. byte단위의 binary 글자들은 사람이 보기에 분별하기 어려운글자가
많으므로 base64 인코딩을 하여많이사용한다.

예를들어보면 ACE 암호화를 이용하여 인코딩을 할떄
(원문) - > ACE암호화 -> BASE64 인코딩       <- BASE64 디코딩 <- ACE복호화 < - 원문
이렇게 중간에서 데이터를 주고받을때 식별가능하도록 만들기위해 BASE64 인/디코딩 방식을 사용하는것이다.
초기 이메일의 경우 테스트만 서로 주고받다가 , 나중에 기술이 좀더 좋아지고나서부터 이미지, 파일첨부와 같은 기능이 생겨나기 시작하여 결국 base64 encoding/decoding이 고안되게 된것이다.
Base64 이외에도 다른 인/디코딩 방식들이 있는데 대표적인것으로 유닉스 환경에서 사용 되어지는 uuencode(Unix - to - Unix encode) 방식과 매킨토시에서 사용되는 BinHex방식이 있다. 두방식또한 64개의 문자를 가지고 표현하지만 , 시스템에 종속적이라는 단점이 있다.

[ 본론 ]
그럼 Base64인/디코딩을 어떻게 하는지방법을 알아보도록 하자. 사실  크게 다를것이 없다. 언어에서 우리가 한글자를 표현할때 8bit를 사용한다. 하지만 Base64에서는 6bit를 사용한다. 왜 6bit를 사용하는것일까? 아까도 말했듯이 64개의 문자를 이용해서 표현한다고 했다. 2^6승이 바로 64이기 때문에 최대 6bit의 글자로 표현할수 있는것이다.
또한8bit의 문자를 6bit로 표현하기위해서 8,6의 최소공배수인 24 bit만큼의 단위로 표현이된다.

즉 일반 문자 3글자를 base64에서는 4개의 문자로 해석한다는것이다.

Ascii Code표도 참조하도록 한다.



64개의 문자에는 어떠한 것이들이 있는지는 아래 표를 참조하도록 한다.



                출처 : http://blog.naver.com/kimsumin75?Redirect=Log&logNo=20056272734


위 처럼 64개의 문자를 사용한다.
그럼 실제 예제를 통하여 Base64에 대해 자세히 알아보도록 하자.
Base64로 인코딩의 경우 경우의 수는 3가지이다.
일반문자 3개 -> 4개로 바꾸는경우의 수이다.
(어떤수) % 3 -> 의 나머지로 올수 있는것은 무엇이 있겠는가? 0,1,2 이다. 그럼 이 3가지 조건에 대해
알아보도록 하자.

(1) 3n 의 경우로 정확하게 나누어 떨어지는 경우

COW 라는 글자를 BASE64 인코딩으로 바꾸어 보도록 하겠다.

문자              C                         O                      W
아스키코드     99                      111                    119
이진수           0 1 1 0 0 0 1 1      0 1 1 0 1 1 1 1     0 1 1 1 0 1 1 1

이 이진수를 6BIT 단위로 잘라보자

6BIT 단위로 자른것  : (011000)(110110)(111101)(110111)
십진수로 변환함 :          24         54         61        55  
BASE64 코드표 :           Y          2           9         3

그럼 저 십진수를 위의 코드표와 맵핑시켜본다.

즉 COW(일반문자) -> BASE64인코딩을 하면 Y293 이란ㄴ 4개의 문자로 표시가 가능하다.

(2) 3n+1의 경우
rang 이라는 글자를 Base64 인코딩으로 바꾸어 보도록 하자.

문자            r                          a                        n                        g
아스키코드   162                      141                      156                     147
이진수         10100010               10001101              10011100              10010011

이 이진수를 6bit 단위로 잘라본다.
6bit 단위로 자른것 : (101000 )( 101000 )( 110110 )( 011100 )( 100100 ) (110000 )( 000000 )( 000000 )
6bit로 했을때 총 24bit 단위가 되어야하는데 저건 넘어버린다. 그래서 24의 두배인 48을
기준으로 padding 처리해준다.

저걸 base64로 인코딩한다.
40 | 40 | 54 | 28 | 36 | 48 | 0 | 0

뒤에 보면 0 이라는 숫자는 순수하게 패딩영역으로 처리된것이다. 따라서 계산에 의한것이 아닌 패딩으로
채워진 부분은 = 으로 맵핑이 된다.

저걸 코드표에 맵핑시켜 보면 oo2ckw== 으로 변환이 된다. 끝 !!!

(3) 3n+2의 경우
super이라는 글자를 Base64 인코딩으로 바꾸어 보도록 하자.

문자          s                            u                      p                       e                    r
아스키코드 115                         117                   112                     101                 114
이진수       01110011                  01110101           01110000              01100101         01110010

이진수 단위를 6bit 단위로 잘라본다.
6bit 단위로 자른것 : (011100)(110111)(010101)(110000)(011001)(010111)(001000)(000000)
6bit 로 했을때 이것또한 24bit를 넘겨버려서 padding을 해주어 48bit를 맞추어준다.

해당핸 데이터를 10진수로 다시 바꾼다.
28 | 55 | 21 | 48 | 25 | 23 | 08 | 0

해당 십진수를 위의 Base64 인코딩 표로 맵핑시켜 보면 c3YwZXI= 가 된다.


와~ 정말길게썼다 일주일에 걸쳐서 짬짬히 틈을 내서 쓰니 뿌듯하기 그지없구나.ㅋㅋㅋ

이제 이걸 코드로 옮겼을때 어떻게 되는지 다음번 블로그 내용을 기대하시랏!!!

Base64란 대충 보면 어렵지만, 하나하나 좀 따져보면 어려운게 아니다.

개발을 하면서 이런저런거 가끔많이 접해 보기도 하지만, 하나하나 꼼꼼히 챙겨서 내꺼를 만들어야

나중에 유횽하게 써먹을 수 있고 돈도 많이 벌수 있다.

21살때부터 28살이 되던해까지 돈만 벌어야겠다는 생각으로 일을 했지만, 제자리 걸음이다. 과연 공부를 해서

돈을 많이 벌수 있는 시절이 올지 모르지만, 그날이 될때까지 ㅋㅋㅋ 성랑랑의 공부는 계속 될것이다.



                                                                                                   --- 2009.12.11 신라의 화랑 성랑랑씀 ---

반응형
반응형
아시는 형부탁으로

간단한 전자세금계산서 발급을 위해 socket방식을 asp에서 해야했다.

아직 c가 어색하고 잘다룰지모르는 나로서는 dll 하나 만드는게 벅차다.

물론 공부하면되겠지만, 시간이 급박해서 일단 오픈소스로 해놓은 w3socket.dll을 이용하기로 했다.

내용은 post방식으로 80번 포트로 값을던져 리턴받는것!

뭐 ㅋㅋㅋ 어렵진않았지만 모듈화를 해서 사용하니 더 좋은것같다.

해당 소스를 참조해서 다음에 이용해야쥐 ㅋㅋ

반응형

'Program > ASP' 카테고리의 다른 글

IIS 설치과정  (0) 2009.11.22

+ Recent posts