文字列のバイト単位の操作
VB.NETではバイト単位で文字列の切り取り等が提供されてなく*1
Utilクラス等に書くのでメモ
バイト数取得
Public Shared Function LenB(ByVal text As String) As Integer If (text Is Nothing) Then Return 0 Else LenB = System.Text.Encoding.Default.GetBytes(text).Length() End If End Function
バイト切り取り(Mid)
Public Shared Function MidB(ByVal str As String, ByVal Start As Integer, ByVal Length As Integer) As String If (str Is Nothing) Then Return "" Else Try Dim byteArray() As Byte = System.Text.Encoding.Default.GetBytes(str) Return System.Text.Encoding.Default.GetString(byteArray, Start, Length) Catch ex As ArgumentOutOfRangeException MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error) Return "" End Try End If End Function Public Shared Function MidB(ByVal str As String, ByVal Start As Integer) As String Return MidB(str, Start, LenB(str) - Start) End Function
Strings.Midでは第3引数を省略した関数も用意されているので、オーバーロードしてみました。
バイト切り取り(Left)
Public Shared Function LeftB(ByVal str As String, ByVal Length As Integer) As String Return MidB(str, 0, Length) End Function
バイト切り取り(Right)
Public Shared Function RightB(ByVal str As String, ByVal Length As Integer) As String Return MidB(str, LenB(str) - Length, Length) End Function
そういえば
MidBをオーバーロードするときに知ったんだけど
Optionalで引数を宣言してから、メソッド内で省略したかどうかを調べるための関数
IsMissingってあったよなって調べてみたけど、VB6までなんだね
Variant型がなくなったからIsMissing関数もなくなったみたい
VB.NETで実装したければ
- Object型の引数で宣言して、OptionalでデフォルトNothingを挿入
- メソッド内で引数がNothingなら、ごにょごにょする
っていう具合で実装できそうだ。
ただ、Nothingが入れられるのがオブジェクトだけだから、
今回のようにInteger型だったりしたら使えない。
別にオーバーロードするしかない。
Optional自体があまり使いたくないけど*2、タイプ量が減るから便利っちゃ便利なんだよね