1文字ずつの反転はStrReverse関数で可能
“12345”を”54321″のように反転させるにはStrReverse関数を使うことで可能です。
文字列の反転はこのStrReverse関数でほとんど対応できます。
しかし、”0102″を”0201″のように2文字ずつの組み合わせで反転させたい場合などは独自の処理を行う必要があります。
2文字ずつ反転させたい理由
以下で紹介するコードは元々私が必要になった際に作った関数です。
16進数の”00″から”FF”を組み合わせた文字列をバイナリファイルに書き込む際にリトルエンディアン(反転状態)で行う必要がありました。例えば16進数の”00″から”FF”を組み合わせた”616263″という文字列の反転は2文字ずつで”636261″というようにです。
なぜこのような対応が必要なのかというと、バイナリデータは”00″から”FF”の1バイト文字で全て構成されています。バイナリファイルの中に見た目での”abc”を登録させたい場合は”abc”の16進数表記である0x61 0x62 0x63で書き込む必要があります。
また書き込む際にエンディアンがビックエンディアン(文字列を左から右に読む)かリトルエンディアン(右から左)かを考慮する必要もありました。リトルエンディアンの場合は見た目上は”abc”ではなく”cba”で書き込む必要があったため、0x63 0x62 0x61の順にバイナリファイルに登録します。
このようなことに使うための関数です。
2文字ずつ反転する関数のコード
引数文字列を2文字ずつ反転させる関数です。
実装方法はいくつかあると思いますが、このコードでは一度StrReverse関数で反転させています。8行目の部分です。
StrReverse関数で反転させると1文字ずつ反転した状態になっているため、2文字の前後を入れ替えると2文字ずつ反転した形になります。
なお、2文字単位の組み合わせになっていない場合(文字列長が偶数でない場合)は処理しないようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Function StrReverseHex(a_str) As String Dim sRev As String Dim i As Long Dim iLen As Long Dim sRet As String '// 引数文字列の文字列長を取得 iLen = Len(a_str) '// 文字列長が偶数でない場合 If (iLen Mod 2) <> 0 Then Debug.Print "2文字ずつの引数文字列でない" Exit Function End If '// 引数文字列を反転 sRev = StrReverse(a_str) '// 戻り値文字列を初期化 sRet = "" '// 2文字ずつループ For i = 1 To iLen Step 2 '// 2文字目を先に取得 sRet = sRet & Mid(sRev, i + 1, 1) '// 1文字目を後に取得 sRet = sRet & Mid(sRev, i, 1) Next StrReverseHex = sRet End Function |
使い方
StrReverseHex関数の引数に文字列を渡します。
2文字ずつ反転させた結果が返ります。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub StrReverseHexTest() Dim s Dim sRet s = "616263" sRet = StrReverseHex(s) '// "636261" Debug.Print sRet s = "616263A" sRet = StrReverseHex(s) '// 2文字ずつでないため処理されない Debug.Print sRet End Sub |
実行結果
636261
2文字ずつの引数文字列でない