Base64 원리 2

Development/Common 2012. 4. 11. 12:21

base64 인코딩 ,디코딩의 원리

1. 써보셨나요?
사용해야
경우는 많겠지만.. 저는 이럴 써요.
 - 웹에서 GET 파라미터로 넘길
 - 한글 데이터가 기종 시스템간 이동하면서 변조되지 않도록 하기 위해서
   (요곤 조금 설명이 필요해요.. 다른 포스트에서 다루던가 아님 덧글 주세요.)

2. 그럼 원리는 아시나요?

base64 64진수라는 뜻입니다.
, base64 인코딩이란, 현재 시스템에서 사용하는 2진수 데이터를 64진수 데이터로 변경해서 표현하겠다는 것이죠.

아시다시피
64 2^6 이지요. 데이터의 단위를 6bit으로 표현하겠다는 겁니다.
그런데
, 일반적으로 컴퓨터는 byte라고 하는 8bit 기준으로 데이터를 표현하는 것이 일반적입니다.
결론적으로
약간 수학적으로 정리하자면, 8bit으로 표현하는 데이터를 6bit으로 표현하겠다는 것이지요.

그럼
이제 조금만 설명해보겠습니다.
아래의
표를 참조하세요.



step1) 먼저 예를 들면 "abc" 8bit 문자로 구성된 byte 문자열 입력입니다.
step2) 그럼 값은 문자를 의미하는 8 bit 이진값으로 표현이 됩니다.
step3) 이를 6bit 단위로 다시 구분해 봅니다.
step4) 이를 base64 문자셋으로 변환합니다.
          여기서 base64 문자셋이란 a-z, A-Z, 0-9, +, / 이루어진 문자셋입니다.
          A ~ Z : 0 ~ 25
          a ~ z : 26 ~ 51
          0 ~ 9 : 52 ~ 61
          +       : 62
          /       : 63
step5)
만일 떨어지지 않으면 어쩌죠?
BASE64 인코딩은 24bit 단위로 항상 수행합니다. (24 8 6 최소공배수입니다.)
그래서
, 남는 비트가 생기면 뒤에 6bit character 0으로 padding 합니다. (예제의 Q 인코딩 하는..)
그리고나서도
남는 6bit character = 으로 치환합니다.




3) 그럼 코드로 만들면 어떻게 될까요?
C 만든 코드를 구해서 포스팅 했습니다. 확인하세요~
http://www.iamcorean.net/125

 

출처 - http://www.iamcorean.net/130

 

================================================================

 

우선 제목이 말하는 Base64의 의미가 무엇인지 살펴 보자.


베이스가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는
2^6 = 64 즉 6 비트 2진수 열이 필요하다.

그런데 대개 컴퓨터에서 가장 기본이 되는 정보 단위는 8 비트씩 엮어진 바이트이므로
6비트와 8비트가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24비트가 된다.

24비트는 8비트 바이트에서는 3바이트가 되고, 64진수로 나타내기 위한 6비트 단위로는 4 단위가 된다. (바이트라고 반복하기 말하면 혼동이 될 것 같아서 "단위"라는 말로 대치하였다.)

따라서 Base64의 인코딩 원리는 3바이트 단위마다 (즉 24비트 마다) 6비트씩 쪼개어서 6비트 짜리 문자 4개로 만드는 것이 되겠다.

이 때 6비트씩 쪼개진 단위를 A-Z a-z 0-9 +- (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.

Base64 Encoding/Decoding


그런데 입력되는 정보가 모두 3바이트씩 떨어진다는 보장이 없으므로 3바이트로 나누어떨어지지 않는 경우 = 문자로 채우기를 한다. 즉 Base64로 인코딩 된 데이타에서 = 가 보이면 그 것은 다시 원래의 정보로 되돌아 갈때 (디코딩 될때) 아무 것도 없는 것이라는 소리가 된다.
(Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개가 되겠다. 즉 끝부분에 =가 없거나 1개가 있거나 2개가 있는 것이 모두 나올 수 있는 경우가 되겠다.)

디코딩은 A-Z a-z 0-9 +- 문자를 각각 6비트의 정보로 바꾸어서 4 단위 (6*4=24 비트) 마다 합쳐서 3바이트 (3*8=24 비트) 로 다시 복원시키면 된다.

이러한 2진수 데이터를 64진수형으로 변환하여 64개의 아스키 코드에 대입하는것이 Base64 알고리즘의 기본이다. 또한 이런 변환을 하는 이유는 암호화에도 있겠지만 보통은 안전한 64개의 아스키문자열로 변환하여 원할한 데이터를 전송하는데 있다. 예를 들자면 한국어의 경우 2바이트 문자열로 그대로 전송할시 문자열의 깨짐이 발생 할 수 있다. 이는 데이터 전송시 원하지 않는 결과이며 이러한것을 막기 위해 안전한 아스키코드 문자로 변환하여 전송 하는것이다. 보통 이러한 Base64인코딩 디코딩은 이메일 전송시 많이 사용된다. 하지만 데이터가 기존의 데이터보다 약 30%이상 커진다는 단점이 있다.
 그럼 일반 문자열을 Base64로 인코딩은 어떻게 하면 될까? 답은 다음의 스텝대로 시도하면 된다.

  1. 소스의 바이너리 데이타로 부터 3바이트씩 꺼낸다. 만약 나머지 소스 문자열이 3바이트가 되지 않는다면 0으로 채운다.
  2. 최초 바이트의 MSB를 6비트씩 4개의 숫자로
  3. 각각의 수치를 하단의 표를 토대로 아스키 문자로 변환한다. 다만 실제의 데이터 길이가 3바이트에 미치지 못한다면 '='로 대체 한다.
  4. 이후 데이터가 없어질때까지 1~3을 반복한다.

**64 bit 수치와 아스키 문자의 대응***

6-bit Value

Encoding

6-bit Value

Encoding

6-bit Value

Encoding

6-bit Value

Encoding

0

A

16

Q

32

g

48

w

1

B

17

R

33

h

49

x

2

C

18

S

34

i

50

y

3

D

19

T

35

j

51

z

4

E

20

U

36

k

52

0

5

F

21

V

37

l

53

1

6

G

22

W

38

m

54

2

7

H

23

X

39

n

55

3

8

I

24

Y

40

o

56

4

9

J

25

Z

41

p

57

5

10

K

26

a

42

q

58

6

11

L

27

b

43

r

59

7

12

M

28

c

44

s

60

8

13

N

29

d

45

t

61

9

14

O

30

e

46

u

62

+

15

P

31

f

47

v

63

/

 

출처 - http://huikyun.tistory.com/70

'Development > Common' 카테고리의 다른 글

Alpha, Beta 버전  (0) 2012.04.27
문자 바이트 수 계산기  (0) 2012.04.12
unreachable code  (0) 2012.03.12
main 함수  (0) 2012.03.07
프로그램 소스코드를 공개하는 사이트  (0) 2012.03.07
Posted by linuxism
,

join & view

DB/Common 2012. 4. 10. 15:14

view와join의 차이점

view와join의 차이점이라..질문자께서 잘못알고 계시는데 view는 테이블이 아닙니다..view는 그 뷰쿼리문이 데이타 딕셔너리에 그대로 저장되어 있는텍스트입니다. 
예를 들어 select * from tab1 a, tab2 b where a.col1 = b.col1 이란 조인쿼리문이나 
create view test_view as 
select * from tab1 a, tab2 b where a.col1 = b.col1 으로 뷰를 만들어 
select * from test_view한거나 위에 쿼리문 select * from tab1 a, tab2 b where a.col1 = b.col1 나 똑같다는거죠. 옵티마이져가 쿼리를 실행시 쿼리변형을 일으켜서 select * from test_view 이 쿼리를 select * from tab1 a, tab2 b where a.col1 = b.col1이렇게 만들어주는거죠 이외에 복잡한 사항이 많은데 엔코아에서 나온 새로쓴대용량데이타베이스를 권해 드리고 싶네요 그책에 자세히 나와 있습니다.


출처 - http://www.okjsp.pe.kr/seq/102596

===================================================================================


VIEW와 JOIN은 어떤걸 사용해야 할까요?

view와 join중 어느것이 빠른지 궁금합니다.

 

프로그램시 join을 해서 select할 경우는 필요한 컬럼만 조건에 맞춰서 가져오면 되는데

view는 우선 join으로 가상의 테이블을 만들어서 데이터를 가져오고

그 view를 다시 select를 하거나 조건을 또 한번 줘서 필요한 부분을 뽑아서 select를 하잖아요...

그러면 view가 느린거 아닌가요?

 

예)

조인은 아래와 같이

 

SELECT a.name, a.id, b.addr

   FROM A a, B b

 WHERE a.seq = b.seq AND a.seq = 1;

 

조건까지 한번에 가져오지만

 

 

VIEW는

 

CREATE OR REPLACE VIEW V_AB

(seq, id, name, addr)
AS

SELECT a.seq, a.name, a.id, b.addr

   FROM A a, B b

 WHERE a.seq = b.seq

 

V_AB 가 한번 join해서 가져오고

이 거져온 view를 통해서 아래와 같이

 

SELECT name, id, addr

   FROM  V_AB

 WHERE seq = 1

 

다시 조건을 줘서 가져오면 view가 더 느린게 아닐까 하는게 제 생각입니다.

 

물론 위에든 예는 간단한거라 그리 상관없겠지만

정말 많은 조인이 일어나고 많은 조건이 있거나 VIEW를 생성하는 과정에서 많은 sub query가 존재 한다면 어떻게 될까요?.

제가 생각하고 있는게 맞는건가요?



안녕하세요. 강남이입니다.

결론부터 말씀드리면 일반 조인 문장을 쓰는 쪽이 빠릅니다.

 

뷰를 사용하는 이유는 크게

1. 보안

2. 편의성

때문입니다.

 

흔히 조인 문장을 뷰로 만들어 사용하는 이유는 위의 두가지 이유 중 두번째인

편의성 때문입니다.

따라서 뷰에 조인문장을 저장한다고 해서 속도 등의 변화가 생기지는 않습니다.

 

다만 조인 문장을 뷰에 저장했다가 실행한다면

뷰에 있는 문장을 풀어내는 시간이 추가적으로 더 필요하겠지요?

 

좋은 답변이 되었기를 바랍니다. 그럼^^


출처 - http://k.daum.net/qna/view.html?qid=4GKW6&aid=4GLp2


=======================================================================


조인 테이블 쓰는 것과 view 테이블 쓰는것중에 어는것이 더 효율적인가요


먼저 관계형 데이터베이스시스템을 제작할 때에는 성능 문제를 가장 중요하게 생각하게 됩니다.
데이터 모델링을 잘하기 위해서 정규화에 신경쓰고,
SQL문을 최적화(Optimizing)해서 사용하기 위하여 옵티마이저의
특성에 맞게 SQL문을 작성하게 되며,
인덱스 등의 데이터베이스 액세스 매커니즘을 연구하여 상황에
맞는 최적의 SQL 실행계획을 수립하게 됩니다.
성능 튜닝 유틸리티를 공부하시면 도움이 될 것입니다.

이렇게 하는데에 있어서 성능관련 문제점을 해결하는 규칙이 있는데 Trade-Off 또는 Plus Sum Game이라는 규칙이 있습니다.
어떤 문제를 푸는데에 절대적인 방법은 없고, 항상 이점과 단점이 존재하므로 양쪽을 감안하여 최적의 해결방안을 선택해야 한다는 것입니다.

따라서 질문하신 내용에 대한 답변은 특정한 SQL문을 단순한 테이블 조인을 거쳐 결과가 산출되는 경우와, View를 사용하여 결과가 산출되는 경우의 성능을 비교하여 사용하는 것이 정답일 것입니다.

대부분은 테이블 조인이 너무 자주 발생하여 성능에 문제가 발생할 때 View(인라인 뷰를 포함)를 사용하면 상당한 도움이 됩니다.
또한 뷰는 정보은닉 등과 같은 장점을 많이 가지고 있으므로,
뷰의 특성을 자세히 기술한 기본 설명들을 참조하시기 바랍니다.

인라인 뷰를 사용하였을 특정한 경우를 제외하고는 뷰의 단점은 크게 경험을 하지 못했는데, 뷰를 사용하지 않고도 목표 성능을 낸다면 사용하지 않는 것이 최선일 것입니다.


출처 - http://k.daum.net/qna/view.html?qid=4GKql













Posted by linuxism
,

결제 테이블은 왜 만드는가 ?
결제 된 돈이 신용카드인지, 휴대폰인지, 뭔지 저장해야 하고 자기가 받은 돈이 얼마나 되는지 알아야 할 이유가 있습니다. 그래서 결제 된 내용을 승인 번호등 결제에 대한 많은 정보들이 리턴되는데 모두 기억해 놓아야 됩니다.

나중에 법적인 근거가 될 수 있습니다. 단순히 결제 금액만 저장하는 방식으로운영하다가는 큰일 납니다. 그래서 결제 테이블이 필요합니ㅏㄷ.

no int(11)  PRI 0  Edit Drop 
order_id varchar(30) YES    Edit Drop 
auth_code varchar(30) YES    Edit Drop 
card_name varchar(30) YES    Edit Drop 
installment varchar(30) YES    Edit Drop 
phoneno varchar(30) YES    Edit Drop 
sendmsg varchar(30) YES    Edit Drop 
pay_name varchar(30) YES    Edit Drop 
pay_socialno varchar(30) YES    Edit Drop 
pay_tel varchar(30) YES    Edit Drop 
email varchar(30) YES    Edit Drop 
method varchar(30) YES    Edit Drop 
goodstitles varchar(30) YES    Edit Drop 
user_id varchar(30) YES    Edit Drop 
name varchar(30) YES    Edit Drop 
date date YES    Edit Drop 
pay int(10) YES    Edit Drop 
bigo varchar(30) YES    Edit Drop 

위 테이블 자세한 내역은 나중에 나오겠지만 관련 문서는 공개 하지 않겠습니다.
지금 강좌를 유료화에 이용하시려는 회원님들이 있어 문제의 요지가 큰 관계로 그냥 둡니다.
별도 작업 하실 분은 hancoma@nate.com으로 메일 주세요.

그리고 저희 회사 상품이기 때문에 100% 공개는 처음부터 계획에 없었으니 참고 하세요.

일단 구조부터 봅시다.

1. 결제 버튼 클릭
2. 회원 아이디 , 결제 금액을 결제 html로 보냅니다.
3. 결제 html에서 결제가 끝난후 (이부분은 우리가 신경 쓰지 않아도 결제 회사에서 알아서 합니다.)
4. 결제에 관계된 정보를 다시 우리에게 보내 줍니다.

이런 방식으로 모든 결제는 이루어 집니다. 주민등록번호 조회등은 우리가 안해도 되니 걱정 마시길 바랍니다.

개념은 아시겠죠. 우린 필요한 정보만 결제 솔루션으로 보내고 프로그램에서 결제를 끝낸후 정보를 다시 우리에게 보내 줍니다. 그것을 가지고 판단을 하는겁니다. 

우리는 보내고 다시 받은 정보를 저장만 하면 됩니다. 받은 정보를 저장하는건 의뢰로 간단하지만 위테이블과 앞 강좌에 말씀 드린 프로그램의 메뉴얼을 읽어 보세요. 연관 될겁니다. 


--------------------
이 프로그램은 저희 솔루션의 일부를 개념만 공개 하는것이니 제발 이걸로 유료 사이트 만드시겠다는 꿈은 버려 주시길 바랍니다.

그리고 요즘 외주 사이트 제작에 정신이 없어서 nzeo.com에 방문 할 기회가 작아 졌습니다. 되도록 질문은 저희 사이트에서 해 주시면 바로 바로 답변 가능합니다. hancoma.com에서 해주세요.


출처 - http://www.xpressengine.com/index.php?mid=phpClass&page=13&sort_index=regdate&document_srl=19373942

Posted by linuxism
,