こんにちは、三流プログラマーのKen3です。 今回は、 2進数文字列と16進文字列の変換処理に挑戦してみます。/* * 1.今回のキッカケ */
文字コードなどの変換で、16進数から2進文字列を作りたかったので、 自作してみました。 意外とハマりました。 16進数 F2 を 11110010 など、2進数の文字列に直したい。 逆に 10100011 を A3 にしたい、 と 質問をもらった。/* * 2.16進数文字列を2進数文字列に直す */
いろいろとやり方があるのですが、8421で計算してみました。 0 --> 0000 1 --> 0001 2 --> 0010 3 --> 0011 ・ ・ 9 --> 1001 A --> 1010 B --> 1011 など、変換表を作成しておいて、置きかえる方法もあるし、 2で割っていったり計算で求めたりとイロイロとありますが、 三流君らしい、下記のサンプルを作ってみました。 処理のポイントは、 F3などの16進文字列から1文字取出します。 Fを取出します。でもこれは文字なので数値に変換したいです。 そこで a = CInt("&H" & "F") と、文字列から数値変換の標準関数Cintを使い、 変換します。 ここから、さらに一工夫して、ビットが8 4 2 1 となっているので、 まずF(15) で、8が立っているか調べるために and 演算しました。 If (nCHK And n8421) = 0 で判断してます。 次は4を調べるので/2で割って、4回、まわしてます(小細工) これで、ビットを調べて0と1の文字列を作成してます。 http://www.ken3.org/cgi-bin/test/test094-1.asp?DATA=F2 でテスト実行できます。 ソースは下記で、回しながら処理を行ってます。 <% 'HEX16進文字列を受け取り2進数文字列を返す%> ※G5など、16進数に無い表記だとエラーが発生してしまうが、 それなりに動作してます。エラーチェック入れねば・・・
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 = 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 Next 'リターン値をセットして終了 HEX16toSTR2 = str2STR End Function/* * 3. 2進数文字列を16進数文字列に直す */
今度は、逆で、1010をAに変換する番です。 1010 これは、8+2です。 えっなんで? 8 4 2 1 と 4つをポイントにビットが立っていたら計算してます。 そんな感じのサンプルが下記のサンプルです。 ポイントは、 0と1を判断して、8 4 2 1の順で数値を+して行き、 4つ単位でHEX関数で、16進に変換してます <% '2進文字列を受け取り16進文字列を返す%> 上から順番にビットをチェックしていき、8421の順で繰り返してます。
Function STR2toHEX16(str2) Dim strHEX Dim n 'ループカウンタ Dim i 'ループのカウンタ Dim n8421 '8 4 2 1の数値計算用 Dim nBYTE 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/* * 4.データが4ビット単位じゃないとバグるよ */
なんとか、出来たと思いつつ、バグを発見。 4つ単位でデータが作られればいいけど、 頭の0を省略します。 0111と書いてほしいんだけど、 111なんてデータがくると、 私の処理だと違う数値に変換してしまいます。 後ろからみる や 桁数のチェック なんてエラー処理、確認処理が必要です。 ア.初めに桁をチェックする 問題なのが、 111と3桁の2進数文字列が来ると、8+4+2をやってしまいます。 0111と送られてくれば、4+2+1で7と計算されるのに。 とするなら、強引に、3桁111を4桁0111にしてしまうそんな処置を足してみました。 '頭4文字単位かチェックする n = Len(str2) Mod 4 '足りない文字数を計算する If n <> 0 Then str2 = String(4 - n, "0") & str2 '頭に文字0を追加する End If 2進数文字列を受け取りHEX16進文字列を返す(頭0を+する) http://www.ken3.org/cgi-bin/test/test094-2.asp?DATA=111 で、テストできます。(無事7と表示されるか、、、) イ.後ろから計算してみる。 問題なのは、111を頭から4桁と決め付けて8+4+2を+してるからだろ だったら、後ろから、1+2+4+8+16+32+64...で計算しろよ、 と、考え方を変えたのが下記の変換プログラムです。 2進数文字列を受け取りHEX16進文字列を返す(頭0を+する) http://www.ken3.org/cgi-bin/test/test094-3.asp?DATA=111010 で、テストできます。(6桁の11 1010を変換すると3Aとなるはず?) <% '2進文字列を受け取り16進文字列を返す(後ろからチェック)%> 処理のポイントは、 文字列を後ろから見るために、逆順のループを作ってみました。 For n = Len(str2) To 1 Step -1 '後ろからループを作る で、次のポイントが、 '次のビットを計算したいので*2で計算 n8421 = n8421 * 2 2進数は*2で次の位が求められるので、単純にカケテ次の位を計算してます。 If Mid(str2, n + i, 1) = "1" Then nBYTE = nBYTE + n8421 'ビットに対応した数値を+する End If あとは、ビットが立っていたら+しているだけです。 最後はHEX関数で、変換しただけです。 こんな感じで、プログラムを一から見直して、作成してみました。
Function STR2toHEX16_B(str2) Dim strHEX Dim n 'ループカウンタ Dim i 'ループのカウンタ Dim n8421 '8 4 2 1の数値計算用 Dim nBYTE strHEX = "" '結果のエリアを初期化する n8421 = 1 '初期値に1を代入する(下から計算したいので) nBYTE = 0 '計算用変数を初期化 '文字数分ループする For n = Len(str2) To 1 Step -1 '後ろからループを作る 'ビットが立っているかチェックする If Mid(str2, n + i, 1) = "1" Then nBYTE = nBYTE + n8421 'ビットに対応した数値を+する End If '次のビットを計算したいので*2で計算 1.2.4.8.16.32...としたい n8421 = n8421 * 2 Next '計算して、数値が完成したので16進文字にしてセットする strHEX = Hex(nBYTE) 'リターン値をセットして関数を抜ける STR2toHEX16_B = strHEX End Function/* * 5.終わりの挨拶 </HTML> */
今回は、 2進数文字列と16進数文字列の変換処理を少しやってみました。 もっと効率の良いやり方があると思いますが、 1つの参考例になれば幸いです。 いろいろと問題点や疑問点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]