|
BASE64変換のサンプル(VB6)

|
<このサンプルの概要>
6ビット(10進数で0〜63)のデータに対し64個の文字を対応させて変換します。
64個の文字とは以下の文字を以下の順番で対応させます。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
基本的に3バイト(24ビット)のデータを4バイトに変換します。しかし、データが足
りない場合は"=" を付加して変換結果が4バイトの倍数になるようにします。
(例)"A"を変換する時の処理過程
"A" のASCIIコードは16進で41です。1文字しか無いので他の2バイトを0して
3バイトを用意します。そのビット列は以下のようになります。
01000001 00000000 00000000
そのビット列を6ビットずつに分けると以下のようになります。
010000 010000 000000 000000
6ビット1つめの010000は10進で16なので64個の文字の17個目(1個目は
0に対応)の文字に変換します。つまり"Q" になります。2つめも偶然010000なの
で"Q" になります。今回の例では"A" 1文字の変換なので2バイト足りないため2つの"="
を変換後データに付加します。結果として"A" をBASE64変換すると"QQ=="になりま
す。
Private Const Base64Chars = _
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim Base64Bytes() As Byte
'
' 関数名 : Base64Encode
' 返り値 : BASE64変換した文字列
' : エラー時は空文字列を返す
' 引き数 : byteData(i) : 変換前データののバイト配列
' 機能説明 : バイナリデータをBASE64で文字列化する
' 備考 :
' 著作権 : Copyright(C) 2007 のん All right reserved
'
Public Function Base64Encode(ByRef byteData() As Byte) As String
On Error GoTo ErrHandler
Dim longData As Long
Dim i As Long
Dim j As Long
Dim addStr As String
Dim outByte() As Byte
ReDim outByte(-1 To -1)
Base64Encode = ""
Base64Bytes = StrConv(Base64Chars, vbFromUnicode)
For i = 0 To UBound(byteData)
If (i Mod 3) = 0 Then
longData = 0
End If
longData = (longData * 256) + byteData(i)
If i = UBound(byteData) Then
For j = 0 To 1 - (i Mod 3)
longData = (longData * 256)
addStr = addStr & "="
Next j
End If
If (i Mod 3) = 2 Or i = UBound(byteData) Then
If UBound(outByte) = -1 Then
ReDim outByte(UBound(outByte) + 4)
Else
ReDim Preserve outByte(UBound(outByte) + 4)
End If
outByte(UBound(outByte) - 3) = _
Base64Bytes(((longData \ (64# * 64# * 64#)) And 63))
outByte(UBound(outByte) - 2) = _
Base64Bytes(((longData \ (64# * 64#)) And 63))
outByte(UBound(outByte) - 1) = _
Base64Bytes(((longData \ (64#)) And 63))
outByte(UBound(outByte) - 0) = _
Base64Bytes(((longData \ (1#)) And 63))
End If
Next i
Base64Encode = StrConv(outByte, vbUnicode)
Base64Encode = left$(Base64Encode, Len(Base64Encode) - Len(addStr)) & addStr
Exit Function
ErrHandler:
MsgBox Err.Description
Exit Function
End Function
'
' 関数名 : Base64Decode
' 返り値 : BASE64復元したバイナリデータのバイト配列
' : エラー時は配列数−1で返す
' 引き数 : strData(i) : BASE64文字列
' 機能説明 : BASE64文字列をバイナリデータに復元する
' 備考 :
' 著作権 : Copyright(C) 2007 のん All right reserved
'
Public Function Base64Decode(ByVal strData As String) As Byte()
On Error GoTo ErrHandler
Dim longData As Long
Dim i As Long
Dim addStr As String
Dim rtn() As Byte
ReDim Base64Decode(-1 To -1)
ReDim rtn(-1 To -1)
For i = 0 To Len(strData) - 1
If (i Mod 4) = 0 Then
longData = 0
addStr = ""
End If
If InStr(Base64Chars, Mid$(strData, i + 1, 1)) > 0 Then
longData = (longData * 64) + (InStr(Base64Chars, Mid$(strData, i + 1, 1)) - 1)
Else
longData = (longData * 64)
addStr = addStr & Mid$(strData, i + 1, 1)
End If
If (i Mod 4) = 3 Or i = Len(strData) - 1 Then
If UBound(rtn) < 0 Then
ReDim rtn(2)
Else
ReDim Preserve rtn(UBound(rtn) + 3)
End If
rtn(UBound(rtn) - 2) = (longData \ (256# * 256#)) Mod 256
rtn(UBound(rtn) - 1) = (longData \ (256#)) Mod 256
rtn(UBound(rtn) - 0) = (longData \ (1#)) Mod 256
ReDim Preserve rtn(UBound(rtn) - Len(addStr))
End If
Next i
Base64Decode = rtn
Exit Function
ErrHandler:
MsgBox Err.Description
Exit Function
End Function