どうも、三流プログラマーのKen3です。 今回は、 BASE64の変換処理にチャレンジしてみます。 http://www.ken3.org/vba/lzh/vba160.lzh にサンプルbase64test.xlsを圧縮しておきます、 Excel2000版ですが使ってみてください。/* * 1.今回のキッカケ */
前回の No.159 IE 認証ページへのアクセス、basci認証ページって? http://www.ken3.org/vba/backno/vba159.html で、 設定したユーザーとパスワードの組み合わせ mailmaga:guest をBASE64変換して bWFpbG1hZ2E6Z3Vlc3Q= ヘッダーに指定 "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q=" そして開いていました。 今回は、このBASE64のコードを探ってみたいと思います。/* * 2.BASE64って何? */
BASE64って何?私の知識でこの単語が引っかかるのは、 メールで添付フアイルを送る時、BASE64って単語を見たことがある程度です。 よし、Yahoo と Googleで探してみるか。(最近検索結果が違うので探りを兼ねて) GoogleでBASE64をキーワードに探すと、 http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=BASE64&lr=lang_ja (日本語のページを探しました) BASE64とは何か : IT用語辞典 ─ 用語解説 ─ 意味 ... http://e-words.jp/w/BASE64.html が一番上に出てきます。(2004/6/6現在) う〜ん、ここは用語説明でした、、、 上から3つ目に、 BASE64 について http://www.sea-bird.org/doc/Cygwin/BASE64enc.html とサイトがあり、 >1.エンコードすべきデータから、3バイト取得する。 >2.取得した3バイトを24ビットのデータ領域に設定する。 >3.上位から6ビットを取り出し、その数値を下記の変換テーブルに従い >キャラクター文字に変換する。 >4.次の6ビット以降も同じ変換を行い、24ビットすべて変換する。 >5.エンコードすべきデータが無くなるまで、1〜4の作業を繰り返す。 > ※エンコードすべきデータが、2バイトしか無い場合は、それまでBASE64 >エンコード変換した文字列の最終位置に'='を付加する。 > ※エンコードすべきデータが、1バイトしか無い場合は、それまでBASE64 >エンコード変換した文字列の最終位置に'=='を付加する。 > >変換テーブル:6ビットデータの「0〜63」を以下の文字列に変換する。 > 0 〜25:A〜Z > 26〜51:a〜z > 52〜61:0〜9 > 62 :+ > 63 :/ と、丁寧に変換方法が載ってました。 YahooでBASE64を検索しても、いろいろなページがヒットします。 http://search.yahoo.co.jp/bin/query?p=BASE64&hc=0&hs=0 読んでいくと、 6ビット単位にデータを取り出し、それを指定された文字に当てはめる。 って感じです。/* * 3.さっそく作ってみた */
手抜きで、漢字2バイトには対応していないが、 下記のように作ってみました。 ※なんか無駄に長いんだけど、気にしないでね。 'BASE64の変換処理にチャレンジする 全角文字未対応
Function base64(strMOJI As String) As String Dim strWORK As String Dim strCODE As String Dim n As Integer, i As Integer Dim nAMARI As Integer Dim n6BOX(5) As Integer '6ビット取り出した数値 Dim nCODE As Integer Dim strRET As String strRET = "" 'リターン値を初期化する For n = 1 To Len(strMOJI) Step 3 '3バイトを2進数に変換する、24ビットの数値を作成する strWORK = "" nAMARI = 0 For i = 0 To 2 strCODE = Mid(strMOJI, n + i, 1) '文字を取り出す If strCODE = "" Then nAMARI = 3 - i strWORK = strWORK & "00000000" Exit For Else 'コードに変換する strWORK = strWORK & HEX16toSTR2(Hex(Asc(strCODE))) End If Next i Debug.Print strWORK '8*3の24ビット2進数から6ビット単位で4つ取り出し、数値に変換する For i = 0 To 3 n6BOX(i) = Val("&H0" & STR2toHEX16(Mid(strWORK, 1 + i * 6, 6))) Debug.Print n6BOX(i) Next i '対応表にそって変換する '6ビットデータの「0〜63」を以下の文字列に変換する。 ' 0 〜25:A〜Z ' 26〜51:a〜z ' 52〜61:0〜9 ' 62 :+ ' 63 :/ For i = 0 To 3 - nAMARI If n6BOX(i) = 63 Then strRET = strRET & "/" If n6BOX(i) = 62 Then strRET = strRET & "+" ' 0 〜25:A〜Z If 0 <= n6BOX(i) And n6BOX(i) <= 25 Then strRET = strRET & Chr(Asc("A") + n6BOX(i) - 0) End If ' 26〜51:a〜z If 26 <= n6BOX(i) And n6BOX(i) <= 51 Then strRET = strRET & Chr(Asc("a") + n6BOX(i) - 26) End If ' 52〜61:0〜9 If 52 <= n6BOX(i) And n6BOX(i) <= 61 Then strRET = strRET & Chr(Asc("0") + n6BOX(i) - 52) End If Next i 'あまりの文字分=を追加する If nAMARI = 1 Then strRET = strRET & "=" If nAMARI = 2 Then strRET = strRET & "==" Next n base64 = strRET End Function |
Function STR2toHEX16(ByVal str2 As String) As String Dim strHEX As String Dim n As Integer 'ループカウンタ Dim i As Integer 'ループのカウンタ Dim n8421 As Integer '8 4 2 1の数値計算用 Dim nBYTE As Integer '頭4文字単位かチェックする n = Len(str2) Mod 4 '足りない文字数を計算する If n <> 0 Then str2 = String(4 - n, "0") & str2 '頭に文字0を追加する End If strHEX = "" '結果のエリアを初期化する '文字数分ループする For n = 1 To Len(str2) Step 4 '4文字(1バイト)単位にループを作る n8421 = 8 '初期値に8を代入する(上から計算したいので) nBYTE = 0 '1バイト計算用変数を初期化 For i = 0 To 3 '4回まわるよ(4ビット分) 'ビットが立っているかチェックする If Mid(str2, n + i, 1) = "1" Then nBYTE = nBYTE + n8421 'ビットに対応した数値を+する End If '次のビットを計算したいので2で割る n8421 = n8421 / 2 Next i '計算して、1倍との数値が完成したので16進文字にしてセットする strHEX = strHEX & Hex(nBYTE) Next n 'リターン値をセットして関数を抜ける STR2toHEX16 = strHEX End Function |
Function HEX16toSTR2(strHEX As String) As String Dim n As Integer 'ループカウンタ Dim i As Integer 'ループのカウンタ Dim n8421 As Integer '8 4 2 1の数値計算用 Dim str2STR As String Dim nCHK As Integer str2STR = "" '結果のエリアを初期化する '文字数分ループする For n = 1 To Len(strHEX) nCHK = CInt("&h" & Mid(strHEX, n, 1)) 'n文字目を数値変換 n8421 = 8 '初期値に8を代入する(上からチェックしたいので) For i = 1 To 4 '4回まわるよ If (nCHK And n8421) = 0 Then 'Andでビットをチェックする str2STR = str2STR & "0" 'ビットは立ってないよ Else str2STR = str2STR & "1" 'ビットは立ってるよ End If '次のビットをチェックしたいので2で割る n8421 = n8421 / 2 Next i Next n 'リターン値をセットして終了 HEX16toSTR2 = str2STR End Function |
Sub bbbb() Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True '見えるようにする(お約束) 'テスト用の認証ページに飛ぶ Const strURL = "http://www.kurokiya.sake-ten.jp/zzz/" Dim strHEAD As String 'ID:passwordをBASE64変換してヘッダ情報を作成する strHEAD = "Authorization: Basic " & base64("mailmaga:guest") & vbCrLf objIE.navigate2 strURL, , , , strHEAD '表示終了まで待つ Do While objIE.Busy = True '何もしないループ(笑) DoEvents Loop 'テストでHTMLソースを取出す Dim strhtml As String strhtml = objIE.Document.all(0).innerHTML '変数に代入 MsgBox "ソースは" & strhtml & "です" End Sub |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]