NonSoft

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