Понимание кода..!

#vb.net

#vb.net

Вопрос:

Вы не можете проголосовать за свой собственный пост 0

 Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class SNMP

    Public Sub New()
    End Sub
    Public Function [get](ByVal request As String, ByVal host As String, ByVal community As String, ByVal mibstring As String) As Byte()
        Dim packet As Byte() = New Byte(1023) {}
        Dim mib As Byte() = New Byte(1023) {}
        Dim snmplen As Integer
        Dim comlen As Integer = community.Length
        Dim mibvals As String() = mibstring.Split("."c)
        Dim miblen As Integer = mibvals.Length
        Dim cnt As Integer = 0, temp As Integer, i As Integer
        Dim orgmiblen As Integer = miblen
        Dim pos As Integer = 0
        ' Convert the string MIB into a byte array of integer values
        ' Unfortunately, values over 128 require multiple bytes
        ' which also increases the MIB length
        For i = 0 To orgmiblen - 1
            temp = Convert.ToInt16(mibvals(i))
            If temp > 127 Then
                mib(cnt) = Convert.ToByte(128   (temp  128))
                mib(cnt   1) = Convert.ToByte(temp - ((temp  128) * 128))
                cnt  = 2
                miblen  = 1
            Else
                mib(cnt) = Convert.ToByte(temp)
                cnt  = 1
            End If
        Next
        snmplen = 29   comlen   miblen - 1
  

Если кто-нибудь поможет мне понять следующий фрагмент кода, я был бы обязан..

 For i = 0 To orgmiblen - 1
        temp = Convert.ToInt16(mibvals(i))
        If temp > 127 Then
            mib(cnt) = Convert.ToByte(128   (temp  128))
            mib(cnt   1) = Convert.ToByte(temp - ((temp  128) * 128))
            cnt  = 2
            miblen  = 1
        Else
            mib(cnt) = Convert.ToByte(temp)
            cnt  = 1
        End If
  

Ответ №1:

Он помещает значение в массив, используя вариант кодировки varint.

Используя кодировку varint, значение сохраняется по семь бит за раз, начиная с младших значащих битов, и используя восьмой бит в качестве стоп-бита, когда оставшееся значение равно нулю. Это метод, который использует BinaryWriter.Write7BitEncodedInt метод.

Приведенный выше код обрабатывает значение, используя не более 14 бит, и сначала сохраняет наиболее значимые биты, используя восьмой бит в качестве флага продолжения вместо флага остановки.

Т.е. значение меньше 128 хранится в одном байте, в то время как значение, равное 128 или больше, хранится с наиболее значимыми семью битами первым, причем восьмой бит установлен для обозначения того, что это двухбайтовое значение, затем остальные семь бит.