猿问

递归定义SNMP消息

我在Go中弄乱了SNMP库,并想出了Field根据本文档定义SNMP BER编码字段的类型。每个字段由类型,长度和值组成,其中类型是ASN.1类型,长度是字段值的长度,值可以是另一个字段,字段序列或字节序列。这使我考虑了递归定义SNMP消息的可能性。这是我想出的一些代码,但是我一直试图将其转换为递归结构:


package main


import "fmt"


// ASN.1 BER encoded types.

type ASN1BER byte


const (

    Integer          ASN1BER = 0x02

    BitString                = 0x03

    OctetString              = 0x04

    Null                     = 0x05

    ObjectIdentifier         = 0x06

    Sequence                 = 0x30

    GetRequest               = 0xa0

)


// SNMP versions.

type Version byte


const (

    Version1  Version = 0x00

    Version2c         = 0x01

)


// SNMP message field.

type Field struct {

    Type  ASN1BER

    Len   int

    Value interface{}

}


func main() {

    // SNMP Message

    msg := &Field{Type: Sequence, Len: 44, Value: []*Field{

        // SNMP Version

        {Type: Integer, Len: 1, Value: Version2c},

        // Community String

        {Type: OctetString, Len: 7, Value: []byte("private")},

        // Get-Request PDU

        {Type: GetRequest, Len: 30, Value: []*Field{

            // Request ID

            {Type: Integer, Len: 1, Value: []byte{0x01}},

            // Error Status

            {Type: Integer, Len: 1, Value: []byte{0x00}},

            // Error Index

            {Type: Integer, Len: 1, Value: []byte{0x00}},

            // Varbind List

            {Type: Sequence, Len: 19, Value: []*Field{

                // Varbind

                {Type: Sequence, Len: 17, Value: []*Field{

                    // OID 1.3.6.1.4.1.2680.1.2.7.3.2.0

                    {Type: ObjectIdentifier, Len: 13, Value: []byte{0x2b, 0x06, 0x01, 0x04, 0x01, 0x94, 0x78, 0x01, 0x02, 0x07, 0x03, 0x02, 0x00}},

                    // Value

                    {Type: Null, Len: 0},

                }}},

            }},

        }},

    }

    fmt.Println(msg)

}

是否可以递归表示SNMP消息?如果是这样,那么基本案例和递归案例将是什么?目的是能够递归地打印,编码和解码SNMP消息。


慕田峪4524236
浏览 242回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答