嗯,实际上我在我的代码中使用它:
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,任何人都有提示或解决方案吗?
答案 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()代替。