[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.96 BASE64の変換処理に挑戦してみた

BASE64の変換処理に挑戦してみた



本文(発行内容)


BASE64の変換処理に挑戦してみた

こんにちは、三流プログラマーのKen3です。

今回は、VBA系でも発行したけど、
BASE64の変換処理にチャレンジしてみました。

/* * 1.今回のキッカケ */

自作した16進数から2進文字列の作成ルーチン http://www.ken3.org/cgi-bin/test/test094-1.asp を使わないとなぁ・・・なんて思ってたら、 VBA系で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 BASE64TEST(strMOJI)

    Dim strWORK
    Dim strCODE
    Dim n, i
    Dim nAMARI
    Dim n6BOX(5)  '6ビット取り出した数値
    Dim nCODE
    Dim strRET
    
    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

        '8*3の24ビット2進数から6ビット単位で4つ取り出し、数値に変換する
        For i = 0 To 3
            n6BOX(i) = CInt("&H0" & STR2toHEX16(Mid(strWORK, 1 + i * 6, 6)))
        Next
        '対応表にそって変換する
        '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 
        'あまりの文字分=を追加する
        If nAMARI = 1 Then strRET = strRET & "="
        If nAMARI = 2 Then strRET = strRET & "=="
    Next

    BASE64TEST = strRET

End Function
%>
処理のポイントは、 ^^^^^^^^^^^^^^^^^^ For n = 1 To Len(strMOJI) Step 3 で、3文字単位のループを作り(Step3で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 上記で、24ビット8ビット*3の2進数文字列を作成し、 そこから、6ビット単位でデータを取り出し、再び数値に変換。 '8*3の24ビット2進数から6ビット単位で4つ取り出し、数値に変換する For i = 0 To 3 n6BOX(i) = CInt("&H0" & STR2toHEX16(Mid(strWORK, 1 + i * 6, 6))) Next ここまでで、6ビット単位の4つの数値が完成する。 で、その数値を、対応表にしたがって、文字に直します。 '対応表にそって変換する '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 ↑オイオイって感じのIf文の羅列ですがご勘弁を。 ↓変換文字が余っていたら=をプラスしてます。 'あまりの文字分=を追加する If nAMARI = 1 Then strRET = strRET & "=" If nAMARI = 2 Then strRET = strRET & "==" Next と、こんな感じで、3文字単位で変換しました。 ※漢字には非対応なので、2バイト文字を使う人は、一工夫してくださいね。

/* * 4.終わりの挨拶 </HTML> */

今回は、 BASE64の変換をやってみた、そんなお話でした。 ※強引に2進数と16進数文字列の関数を使ってみました。 http://www.ken3.org/cgi-bin/test/test096-1.asp でテストできます、何かの時、使ってみてください。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: