/*
* 3. On Error Resume Next でエラー発生時次の行へ(実行時エラーを無視)
*/
On Error Resume Next
と、エラー発生時次の行へ、そんな命令があります。
こいつを使用して、
On Error Resume Next 'エラー発生時次の行へ
nCHK = 0 '0で初期化
nCHK = CInt("&h" & Mid(strHEX, n, 1)) 'n文字目を数値変換
On Error Goto 0 'エラー処理を通常に戻す
としてみました。
まず、
On Error Resume Nextでエラー時次の行に進むことにします。
nCHK = 0 変数を0で初期化します。
nCHK = CInt("&h" & Mid(strHEX, n, 1)) CIntで変換します。
ここで、もしGやHなどでエラーが発生した場合、
On Error Resume Nextが指定してあるので、次の行に処理が移ります。
結果的に何もしないで処理が進みます。nCHKに0を入れてあるので0で進みます。
エラーが発生したら0だ、そんな処理にしてしまいました。
http://www.ken3.org/cgi-bin/test/test095-1.asp?DATA=G1
で、テストできるので、
下記のエラーが発生する
http://www.ken3.org/cgi-bin/test/test094-1.asp
との違いを見てください。
↓On Error Resume Next を使ったソース
<%
'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
%>
/*
* 4.終わりの挨拶 </HTML>
*/
今回は、
実行時エラーを無視して、進んでみました。
キレイなデータが来ない場合もあるので、要注意ですね・・・・
人生にも
On Error Resume Next
があれば・・・と思いつつ。。。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
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バイト文字を使う人は、一工夫してくださいね。
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
Function HEX16toSTR2(strHEX)
Dim n 'ループカウンタ
Dim i 'ループのカウンタ
Dim n8421 '8 4 2 1の数値計算用
Dim str2STR
Dim nCHK
str2STR = "" '結果のエリアを初期化する
'文字数分ループする
For n = 1 To Len(strHEX)
nCHK = 0 '0で初期化
On Error Resume Next 'エラーを無視する
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