16進数文字列
Hex関数を使うと数値を16進数文字列に変換できます。
Hex(10)であれば”A”の1文字が返却され、Hex(65535)は”FFFF”の4文字が返却されます。このように、16進数文字列は0から9とAからFで構成されています。
そして、ある文字列が本当に16進数文字列なのかを判定したい場合があります。思いつくのはTCPやUDPなどの電文が保存されているバイナリファイルが16進数で構成されているかどうか、とかですね。
そのような場合に以下の16進数文字列関数で判定することが出来ます。
事前設定
以下のコードでは正規表現のRegExpクラスを利用しています。そのため事前に正規表現の参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
16進数文字列かどうかを判定する関数
以下のIsHex関数は引数に文字列を指定して、その文字列が16進数文字列かどうかを判定します。
16進数文字列であればTrueを返しますが、そうでない場合はFalseを返します。
大文字と小文字は区別しないようにしているため、”ABCD0123″も”abcd0123″も16進数文字列として正しく判定します。
例えば、”09EF”はTrueを返しますが、”*abc”は*が16進数文字ではないためFalseを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Function IsHex(a_str) As Boolean Dim reg As RegExp Dim oMatches As MatchCollection Dim ret As Boolean '// 0-9とA-Fの文字以外の検索パターンを設定 reg.Pattern = "[^0-9A-F]" reg.Global = True reg.IgnoreCase = True '// 引数文字列から0-9A-Fではない文字を抽出 Set oMatches = reg.Execute(a_str) '// 0-9A-Fでない文字の数が存在する場合 If (oMatches.Count > 0) Then '// 不正とみなす ret = False Else ret = True End If IsHex = ret End Function |
利用例
IsHex関数の利用例です。
文字列を引数として渡し、その結果をBoolean型で受け取ります。
以下は”09EF”と”*abc”がそれぞれ16進数文字列かを判定しています。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub IsHexTest() Dim s Dim ret As Boolean s = "09EF" ret = IsHex(s) Debug.Print s & " " & ret '// 09EF True s = "*abc" ret = IsHex(s) Debug.Print s & " " & ret '// *abc False End Sub |
実行結果
上のコードを実行すると以下が出力されます。
09EF True
*abc False
2つ目の「*abc」は*が16進数文字ではないためFalseが返却されています。