IPアドレスを16進数に変換するには
IPアドレスには192.168.1.1のような32ビット表記のバージョン4(IPv4)と、128ビット表記のバージョン6(IPv6)があります。
これを書いている2019年でもIPアドレス枯渇問題が言われながらもIPv4は現役です。
そのIPアドレスですが、見た目では192.168.100.10のよう分かりやすいフォーマットですが、各ビット値(ドットで区切られた各値)が1文字から3文字と可変であるため、データベースなどで管理する場合は各ビット値が変わらない16進数に変換してから管理することもあります。
サンプルコード
コードを分かりやすくするためにIPアドレスを固定で”192.168.1.10″にして、それを16進数に変換する関数です。
処理の内容はコメントにほとんど書いていますが、分かりにくいところを補足します。
18行目のRight関数を使った処理ですが、左に”00″を付けてます。
これには理由があります。
例えば”10″を16進数にするとHex関数は”0A”ではなく”A”を返します。
“A”1文字のまま各ビットを連結すると、例えば変換後の16進数文字列が”0A0A”の場合に、元のIPアドレスが”0.10.0.10″なのか一部分の”10.10″なのかの判定が出来ません。
このように16進数1文字を連結してしまうと、元のIPアドレスのドット区切り位置の判定がとても面倒になるため、各ビットの16進数変換後の文字列を”00″から”FF”の2文字に統一するために”00″を左につけて、”00A”の右の2文字をRight関数で取って”0A”としています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub ConvIpToHex() Dim ip '// IPアドレス Dim v '// IPアドレスを8ビット単位に分割後の配列 Dim ip8 '// 8ビット分のIPアドレス Dim s '// 変換後のIPアドレス '// IPアドレスを指定 ip = "192.168.1.10" '// .で分割 v = Split(ip, ".") s = "" '// .で分割した数だけループ For Each ip8 In v '// Hex関数で16進数に変換し、その左に"00"を付けた文字列から、右の2文字を連結 s = s & Right("00" & Hex(ip8), 2) Next Debug.Print s '// C0A8010A End Sub |