Memorandum

文字列←→16進法←→2進法の相互変換

文字列、16進法の相互変換、16進法と2進法の相互変換のサンプルコードとメモです。

ポイント

・変換に使用する関数( Mid / Hex / Asc / Val / Char )の使い方
・文字列を高速で連結する関数( Join / $ )の使い方
・連想配列(Collectionオブジェクト)


サンプルコード

基準文字列を次の順に変換。文字列→16進法→2進法→16進法→文字列

Private i As Long
Private varBinary As Variant
Private colHValue As New Collection '連想配列、Collectionオブジェクトの作成
Private lngNu() As Long

Sub Interconversion_Main() '文字列←→16進法←→2進法の相互変換 Dim strData As String varBinary = Array("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", _ "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111") Set colHValue = New Collection '初期化 For i = 0 To 15 '連想配列にvarBinaryの各値をキーとして、16進法「0~F」の値を格納 colHValue.Add CStr(Hex$(i)), varBinary(i) Next '********************** '文字列→16進法→2進法 '********************** strData = "坂江 保" MsgBox strData, , "基準文字列" strData = StrToHex(strData) MsgBox strData, , "文字列→16進法" strData = HtoB(strData) MsgBox strData, , "16進法→2進法" '********************** '2進法→16進法→文字列 '********************** strData = BtoH(strData) MsgBox strData, , "2進法→16進法" strData = HexToStr(strData) MsgBox strData, , "16進法→文字列" Erase lngNu End Sub
Private Function StrToHex(ByVal strData As String) As String '文字列→16進法 Dim strChar As String ReDim strHex(1 To Len(strData)) As String ReDim lngNu(1 To Len(strData)) For i = 1 To Len(strData) strChar = Mid$(strData, i, 1) strHex(i) = Hex$(Asc(strChar)) lngNu(i) = Len(strHex(i)) '16進法の値の桁数を格納 Next StrToHex = Join$(strHex, vbNullString) End Function
Private Function HtoB(ByVal strH As String) As String '16進法→2進法 ReDim strHtoB(1 To Len(strH)) As String For i = 1 To Len(strH) strHtoB(i) = varBinary(Val("&h" & Mid$(strH, i, 1))) Next HtoB = Join$(strHtoB, vbNullString) End Function
Private Function BtoH(ByVal strB As String) As String '2進法→16進法 ReDim strBtoH(1 To Len(strB) / 4) As String For i = 1 To Len(strB) / 4 '2進法(4bit分)を16進法に変換 strBtoH(i) = colHValue.Item(Mid$(strB, (i - 1) * 4 + 1, 4)) Next BtoH = Join$(strBtoH, vbNullString) End Function
Private Function HexToStr(ByVal strData As String) As String '16進法→文字列 Dim lngLen As Long Dim strHex As String ReDim strChar(1 To UBound(lngNu)) As String lngLen = 1 For i = 1 To UBound(lngNu) strHex = Mid$(strData, lngLen, lngNu(i)) strChar(i) = Chr$(Val("&h" & strHex)) lngLen = lngLen + lngNu(i) Next HexToStr = 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]
メンバ数の取得

ページトップへ戻る
Copyright(C) 2009- 坂江保 All Rights Reserved.