【VB.NET】文字列からバイト数を指定して部分文字列を取得(Shift_JIS)

Imports System.Text

''' <summary>
''' 文字列からバイト数を指定して部分文字列を取得する。
''' </summary>
''' <param name="value">対象文字列。</param>
''' <param name="startIndex">開始位置。(バイト数)</param>
''' <param name="length">長さ。(バイト数)</param>
''' <returns>部分文字列。</returns>
''' <remarks>文字列は <c>Shift_JIS</c> でエンコーディングして処理を行います。</remarks>
Public Shared Function SubstringByte(ByVal value As String, ByVal startIndex As Integer, ByVal length As Integer) As String
    Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
    Dim byteArray() As Byte = sjisEnc.GetBytes(value)

    If byteArray.Length < startIndex + 1 Then
        Return ""
    End If

    If byteArray.Length < startIndex + length Then
        length = byteArray.Length - startIndex
    End If

    Dim cut As String = sjisEnc.GetString(byteArray, startIndex, length)

    ' 最初の文字が全角の途中で切れていた場合はカット
    Dim left As String = sjisEnc.GetString(byteArray, 0, startIndex + 1)
    Dim first As Char = value(left.Length - 1)
    If 0 < cut.Length AndAlso Not first = cut(0) Then
        cut = cut.Substring(1)
    End If

    ' 最後の文字が全角の途中で切れていた場合はカット
    left = sjisEnc.GetString(byteArray, 0, startIndex + length)

    Dim last As Char = value(left.Length - 1)
    If 0 < cut.Length AndAlso Not last = cut(cut.Length - 1) Then
        cut = cut.Substring(0, cut.Length - 1)
    End If

    Return cut
End Function