BASE64 を 使った ソースコードを紹介する表示色の説明:ASP VBScriptは <% 〜 %> キーワードはBASE64 です。
<%@LANGUAGE=VBScript%>
<html>
<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis">
<title>CODE BASE64の変換処理のテスト(全角2バイト文字非対応)</title>
</head>
<body>
<h1>CODE BASE64の変換処理のテスト(全角2バイト文字非対応)</h1>
受け取った文字列をBASE64に変換する、そんなテストプログラムを組んでみます<br>
24ビット(8ビット*3)の2進数文字列を作成し、<br>
そこから、6ビット単位でデータを取り出し、再び4つの数値に変換。<br>
で、その数値を、対応表にしたがって、文字に直します。<br>
'6ビットデータの「0〜63」を以下の文字列に変換する。<br>
0 〜25:A〜Z<br>
26〜51:a〜z<br>
52〜61:0〜9<br>
62:+<br>
63:/<br>
あまりは=を追加する<br>
<br>
※詳細は、ソースと詳細解説のページを見てください。<br>
<hr>
<%
CHK_DATA = Request.Form("DATA") 'データを変数に保存
'長さをチェックする
If Len(CHK_DATA) <> 0 Then '文字が入っていたら
Response.Write "受け取ったデータは<br>"
Response.Write Server.HTMLEncode(CHK_DATA)
'関数を呼んで、BASE64に変換して表示する
Response.Write "<br>BASE64に変換すると<br>"
Response.Write BASE64TEST(CHK_DATA) & "<br>です<HR>"
Else
CHK_DATA = "ABCDEFG"
End If
%>
テストデータの入力<br>
<FORM ACTION="test096-1.asp" METHOD="POST">
変換したい文字列を入力してください。<br>
<INPUT TYPE="text" SIZE="24" NAME="DATA" VALUE="<%=CHK_DATA%>">
<INPUT TYPE="submit" VALUE="変換開始"><br>
↑いろいろと遊んでみてください↑
</FORM>
※2バイト文字(漢字)に対応してません・・・早く対応しろって???<br>
<br>
</body>
</html>
<%
'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
'HEX16進文字列を受け取り2進数文字列を返す
Function HEX16toSTR2(strHEX)
Dim n 'ループカウンタ
Dim i 'ループのカウンタ
Dim n8421 '8 4 2 1の数値計算用
Dim str2STR
Dim nCHK
str2STR = "" '結果のエリアを初期化する
'文字数分ループする
For n = 1 To Len(strHEX)
On Error Resume Next 'エラー発生時次の行へ
nCHK = 0 '0で初期化
nCHK = CInt("&h" & Mid(strHEX, n, 1)) 'n文字目を数値変換
On Error Goto 0 'エラー処理を通常に戻す
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
Next
'リターン値をセットして終了
HEX16toSTR2 = str2STR
End Function
'2進文字列を受け取り16進文字列を返す
Function STR2toHEX16(str2)
Dim strHEX
Dim n 'ループカウンタ
Dim i 'ループのカウンタ
Dim n8421 '8 4 2 1の数値計算用
Dim nBYTE
'頭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
'計算して、1倍との数値が完成したので16進文字にしてセットする
strHEX = strHEX & Hex(nBYTE)
Next
'リターン値をセットして関数を抜ける
STR2toHEX16 = strHEX
End Function
%>
|
|