3

以下は、Richard Blum 著の本 C# Network Programmingm からのものです。

public byte[] get(string request, string host, string community, string_ mibstring)
{
    byte[] packet = new byte[1024];
    byte[] mib = new byte[1024];
    int snmplen;
    int comlen = community.Length;
    string[] mibvals = mibstring.Split('.');
    int miblen = mibvals.Length;
    int cnt = 0, temp, i;
    int orgmiblen = miblen;
    int pos = 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; i < orgmiblen; i++)
    {
        temp = Convert.ToInt16(mibvals[i]);
        if (temp > 127)
        {
            mib[cnt] = Convert.ToByte(128 + (temp / 128));
            mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
            cnt += 2;
            miblen++;
        } 
        else
        {
        mib[cnt] = Convert.ToByte(temp);
        cnt++;
        }
    }
    snmplen = 29 + comlen + miblen - 1; //Length of entire SNMP packet
    //The SNMP sequence start
    packet[pos++] = 0x30; //Sequence start
    packet[pos++] = Convert.ToByte(snmplen - 2); //sequence size
    //SNMP version
    packet[pos++] = 0x02; //Integer type
    packet[pos++] = 0x01; //length
    packet[pos++] = 0x00; //SNMP version 1
    //Community name
    packet[pos++] = 0x04; // String type
    packet[pos++] = Convert.ToByte(comlen); //length
    //Convert community name to byte array
    byte[] data = Encoding.ASCII.GetBytes(community);
    for (i = 0; i < data.Length; i++)
    {
        packet[pos++] = data[i];
    }
}

次のコードがわかりませんでした。

    for (i = 0; i < orgmiblen; i++)
    {
        temp = Convert.ToInt16(mibvals[i]);
        if (temp > 127)
        {
            mib[cnt] = Convert.ToByte(128 + (temp / 128));
             mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
             cnt += 2;
             miblen++;
        } 
        else
        {
            mib[cnt] = Convert.ToByte(temp);
            cnt++;
        }
    }

これは、temp が 1 バイトより大きい場合に 2 バイトに分割するためのものだと理解しています。しかし、128+(temp/128) と 2 番目のバイトの計算は何ですか: temp- (temp/128)*128、これは私が理解していないことです。

助けてください、ありがとう。

4

3 に答える 3

1

以下はSNMP MIB の理解ページ 394からの引用です。この本は他のどの本よりも技術的な詳細を説明しているためです。

エンコードされた OBJECT IDENTIFIER は、エンコードおよび連結された元の値の各サブ識別子で構成されます。各サブ識別子は一連のオクテットとしてエンコードされます。これは次のとおりです。

  • 各オクテットのビット 8 は、このビットを 0 に設定することにより、それがサブ識別子の最後のオクテットであるかどうかを示します。
  • オクテットのビット 7 から 1 を連結すると、サブ識別子の値が形成されます。
  • サブ識別子の最初のオクテットの値が 80 (16 進数) でない場合があります。これにより、エンコードに使用されるオクテット数が最小になります。値 80 (16 進数) は、さらにオクテットが続くことを示しますが、値ビット (7-1) はゼロに設定されます。

実際、質問の本文に貼り付けられたソース コードは、ルールに従ってバイトを解析します。したがって、ルールを理解すれば、コードを理解できます。

(更新: 規則はITU-T X.690、ISO/IEC 8825-1 に基づいています。)

于 2013-06-28T10:35:01.123 に答える
-1

これはすべての値で機能します。

        for (i = 0; i < orgmiblen; i++)
        {
            temp = Convert.ToInt64(mibvals[i]);
            int k = (int)Math.Log((Double)temp, (Double)2) / 7;
            miblen += k;
            int continuation = 0;
            do
            {
                mib[cnt++ + k] = Convert.ToByte((temp & 127) + continuation);
                temp = ((int)(temp / 128));
                continuation = 128;
                k -= 2;
            }
            while (temp > 0);
        }
于 2014-07-02T11:07:47.463 に答える