1

我已经为此工作了几天,我只是在旋转我的轮子。这是一段 vb.net 代码,用于连接到 mikrotik 路由器的 api。它是在他们的 wiki 上提供的,但是会弹出一个错误,我很难找到答案。

Public Function Read() As List(Of String)
        Dim output As New List(Of String)
        Dim o = ""
        Dim tmp(4) As Byte
        Dim count As Long

        While True
            tmp(3) = tcpStream.ReadByte()
            Select Case tmp(3)
                Case 0
                    output.Add(o)
                    If o.Substring(0, 5) = "!done" Then
                        Exit While
                    Else
                        o = ""
                        Continue While
                    End If
                Case Is < &H80
                    count = tmp(3)

                Case Is < &HC0
                    count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(3), 0, 0}, 0) ^ &H8000

                Case Is < &HE0
                    tmp(2) = tcpStream.ReadByte()
                    count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(2), tmp(3), 0}, 0) ^ &HC00000

                Case Is < &HF0
                    tmp(2) = tcpStream.ReadByte()
                    tmp(1) = tcpStream.ReadByte()
                    count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(1), tmp(2), tmp(3)}, 0) ^ &HE0000000

                Case &HF0
                    tmp(3) = tcpStream.ReadByte()
                    tmp(2) = tcpStream.ReadByte()
                    tmp(1) = tcpStream.ReadByte()
                    tmp(0) = tcpStream.ReadByte()
                    count = BitConverter.ToInt32(tmp, 0)
                Case Else
                    Exit While   'err
            End Select

            For i = 0 To count - 1
                o += ChrW(tcpStream.ReadByte())
            Next
        End While
        Return output
    End Function

大多数情况下,当我运行它时,一切正常,但如果响应太长,它就会出错,我认为这至少是导致它的原因。如果代码到达

count = BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(3), 0, 0}, 0) ^ &H8000

我得到“算术运算导致溢出”

我知道这一切是如何运作的,但我只是不明白这里发生了什么。tcpStream.ReadByte() 返回 143

tmp(3) 返回 128

BitConverter.ToInt32(New Byte() {tcpStream.ReadByte(), tmp(3), 0, 0}, 0) ^ &H8000 返回“无限”,我认为这是问题所在。

如果您对其使用的完整代码感兴趣,可以在这里找到: http ://wiki.mikrotik.com/wiki/API_in_VB_dot_NET

如果没有人能告诉我出了什么问题,我真的很想知道这段代码在做什么......希望他们能评论他们的代码 =P

非常感谢大家

4

0 回答 0