文字列←→16進数←→2進数の相互変換2013.09.23 更新日:2024.04.21
文字列と16進数の相互変換、16進数と2進数の相互変換のサンプルコードとメモです。
ポイント
・変換に使用する関数( Mid / Hex / Asc / Val / Char )の使い方
・文字列を高速で連結する関数( Join / $ )の使い方
・連想配列(Collectionオブジェクト)
Excelマクロ管理ツール
サンプルコード2013.09.23 更新日:2024.04.21
変換対象の文字列を次の順に変換。
文字列→16進数→2進数→16進数→文字列
サンプルコードの実行例
'---------------------------------------------------------- ' 文字列 ←→ 16進数 ←→ 2進数の相互変換マクロ '---------------------------------------------------------- Sub Interconversion_Main() ' 変換対象文字列 Dim str As String str = "坂江 保" MsgBox str, , "変換対象文字列" ' 文字列 → 16進数 Dim strHexString As String strHexString = convertStringToHex(str) MsgBox strHexString, , "文字列 → 16進数" ' 16進数 → 2 進数 Dim strBinaryString As String strBinaryString = convertHexToBinary(strHexString) MsgBox strBinaryString, , "16進数 → 2 進数" ' 2 進数 → 16進数 strHexString = convertBinaryToHex(strBinaryString) MsgBox strHexString, , "2 進数 → 16進数" ' 16進数 → 文字列 str = convertHexToString(strHexString) MsgBox str, , "16進数 → 文字列" End Sub
'---------------------------------------------------------- ' 文字列を16進数に変換する関数 '---------------------------------------------------------- '[引数] ' strTarget:対象文字列 '[戻り値] ' 各文字を16進数に変換した値を半角スペースで連結した文字列 ' 引数が空の文字列の場合は空の文字列 '[作成日]2013.09.23 [更新日]2024.04.20 '---------------------------------------------------------- Function convertStringToHex(ByVal strTarget As String) As String If Len(strTarget) = 0 Then Exit Function Dim i As Long ReDim strHex(1 To Len(strTarget)) As String For i = 1 To Len(strTarget) strHex(i) = Hex$(Asc(Mid$(strTarget, i, 1))) Next convertStringToHex = Join$(strHex, " ") End Function
'---------------------------------------------------------- ' 16進数を2進数に変換する関数 '---------------------------------------------------------- '[引数] ' strHex:16進数の文字列 '[戻り値] ' 16進数を2進数に変換した値を半角スペースで連結した文字列 ' 引数が空の文字列の場合は空の文字列 '[作成日]2013.09.23 [更新日]2024.04.20 '---------------------------------------------------------- Function convertHexToBinary(ByVal strHex As String) As String If Len(strHex) = 0 Then Exit Function '--------------------------------------- ' 0~15の2進数を配列として設定 '--------------------------------------- Dim varBinaryNumber As Variant varBinaryNumber = Array("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", _ "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111") '--------------------------------------- ' 16進数を2進数に変換 '--------------------------------------- Dim i As Long ReDim strBinary(1 To Len(strHex)) As String For i = 1 To Len(strHex) If StrComp(Mid$(strHex, i, 1), " ") = 0 Then strBinary(i) = " " Else strBinary(i) = varBinaryNumber(Val("&h" & Mid$(strHex, i, 1))) End If Next convertHexToBinary = Join$(strBinary, vbNullString) End Function
'---------------------------------------------------------- ' 2進数を16進数に変換する関数 '---------------------------------------------------------- '[引数] ' strBinary:2進数の文字列 '[戻り値] ' 2進数を16進数に変換した値を半角スペースで連結した文字列 ' 引数が空の文字列の場合は空の文字列 '[作成日]2013.09.23 [更新日]2024.04.20 '---------------------------------------------------------- Function convertBinaryToHex(ByVal strBinary As String) As String If Len(strBinary) = 0 Then Exit Function '--------------------------------------- ' 0~15の2進数を配列として設定 '--------------------------------------- Dim varBinaryNumber As Variant varBinaryNumber = Array("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", _ "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111") '--------------------------------------- ' コレクションオブジェクトに2進数を設定 '--------------------------------------- Dim i As Long ' 2進数を「キー」とし、対応する16進数「0~F」を「アイテム」として登録 Dim colHexAndBinary As New Collection For i = 0 To 15 colHexAndBinary.Add CStr(Hex$(i)), varBinaryNumber(i) Next '--------------------------------------- ' 2進数を16進数に変換 '--------------------------------------- ' 2進数の文字列をスペースで分割し配列として設定 Dim varArray As Variant If InStr(1, strBinary, " ") Then varArray = Split(strBinary, " ") Else ReDim varArray(0) varArray(0) = strBinary End If ' 2進数を4bitずつ16進数に変換 Dim j As Long For i = 0 To UBound(varArray) ReDim strHext(1 To (Len(varArray(i)) / 4)) As String For j = 1 To (Len(varArray(i)) / 4) strHext(j) = colHexAndBinary.Item(Mid$(varArray(i), (j - 1) * 4 + 1, 4)) Next varArray(i) = Join$(strHext, vbNullString) Next convertBinaryToHex = Join$(varArray, " ") End Function
'---------------------------------------------------------- ' 16進数を文字列に変換する関数 '---------------------------------------------------------- '[引数] ' strHex:16進数の文字列 '[戻り値] ' 16進数から変換した文字を連結した文字列 ' 引数が空の文字列の場合は空の文字列 '[作成日]2013.09.23 [更新日]2024.04.20 '---------------------------------------------------------- Function convertHexToString(ByVal strHex As String) As String If Len(strHex) = 0 Then Exit Function '--------------------------------------- ' 16進数を文字列に変換 '--------------------------------------- ' 16進数の文字列をスペースで分割し配列として設定 Dim varArray As Variant If InStr(1, strHex, " ", vbTextCompare) Then varArray = Split(strHex, " ") Else ReDim varArray(0) varArray(0) = strHex End If Dim i As Long ReDim strChar(UBound(varArray)) As String For i = 0 To UBound(varArray) strChar(i) = Chr$(Val("&h" & varArray(i))) Next convertHexToString = Join$(strChar, vbNullString) End Function
メモ
「$」の付く関数
Mid関数
Hex関数
指定した値を 16 進数で表した文字列型 (String) を返す。
構文:Hex(number)
[number]
必ず指定。任意の数式または文字列式を指定。
整数でない場合、変換の前に一番近い整数に丸められる。
メモ:適切な範囲の数値の前に&Hを付けて記述すると、値を直接16進数で記述できる。
例:10 進数の 16 → &H10
Asc関数
指定文字列の先頭の文字を文字コードで返す変換関数。整数型 (Integer) の値を返す。
構文:Asc(string)
[string]
任意の文字列式を必ず指定。
【メモ】
・対になる関数はChr関数
・文字列に含まれたバイトデータを取得するには、AscB 関数を使用
・AscW関数は、Unicode 文字セットの文字を返す。Unicode をサポートしていない場合は、Asc関数と同じ文字コードを返す
Val関数
指定した文字列に含まれる数値を適切なデータ型に変換して返す。
構文:Val(string)
[string]
任意の文字列式を必ず指定。
【メモ】
・文字列中に数字以外の文字が見つかると、Val 関数は読み込みを中止
・円記号 (\) やカンマ (,) なども、Val 関数は数値として解釈しない
・基数を示すプリフィックス &O (8 進数) や &H (16 進数) は認識
・引数の文字列中に含まれるスペース、タブ、ライン フィードは無視される
例:Val(" 1615 198th Street N.E.") → 1615198
Chr関数
指定した文字コードに対応する文字を示す文字列型 (String) の値を返す。
構文:Chr(charcode)
[charcode]
文字を特定するための長整数型 (Long) の値を必ず指定。
【メモ】
・対になる関数はAsc関数
・文字列型 (String) のデータをバイトデータとして扱う場合は、ChrB 関数を使用
・ChrW 関数は、Unicode 文字セットの文字を含む文字列型 (String) で文字を返す。Unicode をサポートしていない場合は、Chr関数と同じ文字コードを返す
Join関数
配列の各要素を結合して作成される文字列を返す。
構文:Join(sourcearray [, delimiter])
[sourcearray]
必ず指定。結合する文字列を含む 1 次元配列を指定。
[delimiter]
省略可能。戻り値となる文字列を区切るのに使用する文字を指定。
省略すると半角スペース (" ") が使用。
Collectionオブジェクト
Collection オブジェクトとは、1 つのオブジェクトとして参照できる複数の要素の集合。Collection オブジェクトを利用すると、互いに関連付けられた複数の要素を 1 つのオブジェクトとして参照できる。連想配列と呼ぶこともある。作成方法は次のとおり。
Dim X As New Collection
Collectionオブジェクトのメソッドは以下のとおり。
[Add]
オブジェクトにメンバを追加。主な引数は、取得対象の[Item]と、取得時の[key]
[Remove]
メンバの削除。引数は[Index]。[Index]は追加した順に「1」からつけられる。
削除した場合には、自動的に付け直される。
[Item]
メンバの取得
[Count]
メンバ数の取得