[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.094 2進数文字列と16進文字列の変換処理に挑戦

2進数文字列と16進文字列の変換処理に挑戦



本文(発行内容)


2進数文字列と16進文字列の変換処理に挑戦

こんにちは、三流プログラマーの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進数文字列を返す
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
%>
※G5など、16進数に無い表記だとエラーが発生してしまうが、  それなりに動作してます。エラーチェック入れねば・・・

/* * 3. 2進数文字列を16進数文字列に直す */

今度は、逆で、1010をAに変換する番です。 1010 これは、8+2です。 えっなんで? 8 4 2 1 と 4つをポイントにビットが立っていたら計算してます。 そんな感じのサンプルが下記のサンプルです。 ポイントは、 0と1を判断して、8 4 2 1の順で数値を+して行き、 4つ単位でHEX関数で、16進に変換してます <% '2進文字列を受け取り16進文字列を返す
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
%>
上から順番にビットをチェックしていき、8421の順で繰り返してます。

/* * 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進文字列を返す(後ろからチェック)
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
%>
処理のポイントは、 文字列を後ろから見るために、逆順のループを作ってみました。 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関数で、変換しただけです。 こんな感じで、プログラムを一から見直して、作成してみました。

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

今回は、 2進数文字列と16進数文字列の変換処理を少しやってみました。 もっと効率の良いやり方があると思いますが、 1つの参考例になれば幸いです。 いろいろと問題点や疑問点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 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記事 バックナンバー目次]


広告: