|
|||||
<このサンプルの概要> 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 |