forked from idawes/gosnmp
/
octetstring.go
40 lines (35 loc) · 1.38 KB
/
octetstring.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package gosnmp
import (
"fmt"
)
type OctectString []byte
// encodeOctetString writes an octet string to the encoder. It returns the number of bytes written to the encoder
func (encoder *berEncoder) encodeOctetString(val OctectString) int {
h := encoder.newHeader(snmpBlockType_OCTET_STRING)
buf := encoder.append()
buf.Write(val)
_, encodedLength := h.setContentLength(buf.Len())
return encodedLength
}
func (decoder *berDecoder) decodeOctetStringWithHeader() (OctectString, error) {
startingPos := decoder.pos
blockType, blockLength, err := decoder.decodeHeader()
if err != nil {
return nil, err
}
if blockType != snmpBlockType_OCTET_STRING {
return nil, fmt.Errorf("Expecting type snmpBlockType_OCTET_STRING (0x%x), found 0x%x at pos %d", snmpBlockType_OCTET_STRING, blockType, startingPos)
}
return decoder.decodeOctetString(blockLength)
}
func (decoder *berDecoder) decodeOctetString(numBytes int) (OctectString, error) {
if numBytes > decoder.Len() {
return nil, fmt.Errorf("Length %d for octet string exceeds available number of bytes %d at pos %d", numBytes, decoder.Len(), decoder.pos)
}
val := make(OctectString, numBytes)
if numRead, err := decoder.Read(val); err != nil || numRead != numBytes {
return nil, fmt.Errorf("Could only read %d of %d bytes for octet string at pos %d, err: %s", numRead, numBytes, decoder.pos, err)
}
decoder.pos += numBytes
return val, nil
}