본문 바로가기

VBA/기타

[VBA] Base64 Encoding/Decoding

반응형

Base64


바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 문자로 표현하기 위해 만들어진 인코딩이다. ASCII 문자 하나가 64진법의 숫자 하나를 의미하기 때문에 BASE64라는 이름을 가졌다.

 

데이터를 64종류의 인쇄 가능한 숫자만을 이용하여 인코딩하는 방식으로, 그 외의 문자를 처리할 수 없는 통신 환경에서 멀티바이트 문자나 이진 데이터를 처리하는 것을 목적으로 한다.

 

8비트 이진 데이터를 64개의 문자를 이용하여 아스키(ASCII) 영역의 일련의 문자열로 바꾸는 인코딩 방식을 말한다. 7비트 데이터만 처리 가능한 SMTP 이메일 프로토콜에서 널리 이용되어 왔다. 구체적으로 A-Z, a-z, 0-9까지의 62개 문자와 +, /의 2가지 기호가 사용되며, 남은 부분을 포장하기 위한 패딩(padding)을 위해 = 기호가 사용된다. 다목적 인터넷 우편 확장 표준 규격인 MIME에서 인코딩 방식 중 하나로 사용되며, 베이스64 방식을 사용하는 경우 데이터 크기가 33% 증가한다.

베이스64 변환 단계는 우선 원래 데이터를 6비트씩 분할한다. 6비트 미만인 데이터의 경우 0을 추가한다. 그 후 각 6비트 값을 변환표를 사용하여 4글자씩 변환한다. 4글자 미만인 부분은 = 기호를 추가하여 4개의 문자로 구성한다.

주로 이메일, 전자게시판 등에서 사용되지만, 이 인코딩을 하면 데이터 양이 크게 증가하기 때문에 대용량 파일 송수신을 할 경우 비교적 느리다. 또한 URL에 베이스64를 포함시키는 경우 / 기호 등이 문제를 일으키기 때문에, 이를 해결하기 위해 !, - 기호 등을 이용하는 변형판이 존재한다.

 

 

예시


원문 B 6 4
바이트 값 0x42 0x36 0x34
2진수 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 0
변환 값 16 35 24 52
결과 Q j Y 0

 

 

Base64 변환 표


문자 문자 문자 문자
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 /

 

 

VBA Code


Base64 Encode

Function Base64Encode(ByRef arrData() As Byte) As String 

    Dim objXML As MSXML2.DOMDocument 
    Dim objNode As MSXML2.IXMLDOMElement 
     
    Set objXML = New MSXML2.DOMDocument 
    Set objNode = objXML.createElement("b64") 

    objNode.DataType = "bin.base64" 
    objNode.nodeTypedValue = arrData 
    Base64Encode = Replace(objNode.text, Chr(10), vbNullString) 

    Set objNode = Nothing 
    Set objXML = Nothing 

End Function

 

Base64 Decode

Function Base64Decode(ByVal strData As String) As Byte() 

    Dim objXML As MSXML2.DOMDocument 
    Dim objNode As MSXML2.IXMLDOMElement 
    
    Set objXML = New MSXML2.DOMDocument 
    Set objNode = objXML.createElement("b64") 
     
    objNode.DataType = "bin.base64" 
    objNode.text = strData 
    Base64Decode = objNode.nodeTypedValue 
    
    Set objNode = Nothing 
    Set objXML = Nothing 

End Function
반응형

'VBA > 기타' 카테고리의 다른 글

[VBA] SHA-256 Encrypt  (0) 2019.09.30