文字列のバイト単位の操作

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、タイプ量が減るから便利っちゃ便利なんだよね

*1:.NET Framework1.1

*2:VB独自の仕様だから