3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VB.Net)String型変数の値(文字列)を16進数でダンプする

デバッグ中に文字列を16進数でダンプする方法です。

エンコーディングを指定し、そのエンコーディングで文字列をByte型配列にします。

(WindowsAPI等内部的に文字列はUTF-16で処理しているので、エンコーディングUnicode(UTF-16)にしておきます。)

その後、数値書式指定でX2で2桁16進数に出力します。

下記は引数に渡された文字列をコンソールに出力する例です。

Private Sub DumpString(ByVal str As String)

' エンコーディングUnicode

Dim sourceEncoding As System.Text.Encoding = System.Text.Encoding.Unicode

'文字列をバイト型配列に変換

Dim bytAry As Byte() = sourceEncoding.GetBytes(str)

For Each value As Byte In bytAry

'16進数2桁でコンソールに出力

Console.Write("{0:X2} ", value)

Next

Console.WriteLine()

End Sub

たとえば "ABCあいうえお" という文字列を上のメソッドでダンプすると下記のようになります。

41 00 42 00 43 00 42 30 44 30 46 30 48 30 4A 30

さて、ここで注意しないといけないのはこの出力結果がリトル・エンディアンになっていることです。

トルエンディアンとはUTF-16文字コードでコードの上位バイトと下位バイトが入れ替わったバイト列のことです。

つまり、上記の結果だと通常の符号単位列としてみるにはダンプ結果を1バイトずつ交互に入れ替えます。

A B C あ い う え お

00 41 00 42 00 43 30 42 30 44 30 46 30 48 30 4A

あと、注意しないといけないのはUTF-16は基本的には2バイトで1文字あらわすのですが、2バイトに割り当てられなかった漢字は4バイトで表すということです。

参考:

Wikipedia UTF-16

Unicodeの概略を理解する

ITpro 文字コードの基本

バイト列と数値を変換するには?