计算UTF8 readpos

时间:2014-07-11 20:43:06

标签: vb.net utf-8

嗯,实际上我在我的代码中使用它:

Public Sub WriteString(ByVal Input As String)
    Buff.AddRange(BitConverter.GetBytes(Input.Length))
    Buff.AddRange(Encoding.Unicode.GetBytes(Input))
End Sub
Public Function ReadString(Optional ByVal Peek As Boolean = True) As String
    Dim Len As Integer = ReadInteger(True) * 2
    Dim ret As String = Encoding.Unicode.GetString(Buff.ToArray, readpos, Len)
    If Peek And Buff.Count > readpos Then
        If ret.Length > 0 Then
            readpos += Len
        End If
    End If
    Return ret
End Function

功能ReadInteger:

Public Function ReadInteger(Optional ByVal peek As Boolean = True) As Integer
    If Buff.Count > readpos Then 'check to see if this passes the byte count
        Dim ret As Integer = BitConverter.ToInt32(Buff.ToArray, readpos)
        If peek And Buff.Count > readpos Then
            readpos += 4
        End If
        Return ret
    Else
        Throw New Exception("Byte Buffer Past Limit!") 'past byte count throw a new exception
    End If
End Function

我想将Unicode更改为UTF8,任何人都有提示或解决方案吗?

1 个答案:

答案 0 :(得分:1)

你应该强烈考虑BinaryReader / Writer。

但是如果你坚持这个,那么通过写 bytes 的数量来解决你的问题,而不是字符串的长度:

Public Sub WriteString(ByVal Input As String)
    Dim bytes = Encoding.UTF8.GetBytes(Input)
    Buff.AddRange(BitConverter.GetBytes(bytes.Length))
    Buff.AddRange(bytes)
End Sub

Public Function ReadString(Optional ByVal Peek As Boolean = True) As String
    Dim bytes = ReadInteger(True)
    Dim str = Encoding.UTF8.GetString(Buff.ToArray, readpos, bytes)
    readpos += bytes
    Return str
End Function

请注意,Buff.ToArray很丑,它会造成太多垃圾。不知道Buff可能是,如果是MemoryStream则使用GetBuffer()代替。