1 // Copyright (c) 2020 Cisco and/or its affiliates.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at:
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
23 // Buffer provides buffer for encoding and decoding data on wire.
29 // NewBuffer creates new buffer using b as data.
30 func NewBuffer(b []byte) *Buffer {
36 // Bytes returns buffer data up to current position.
37 func (b *Buffer) Bytes() []byte {
41 func (b *Buffer) EncodeBytes(v []byte, length int) {
45 copy(b.buf[b.pos:b.pos+length], v)
49 func (b *Buffer) DecodeBytes(length int) []byte {
50 v := b.buf[b.pos : b.pos+length]
55 func (b *Buffer) EncodeBool(v bool) {
64 func (b *Buffer) DecodeBool() bool {
65 v := b.buf[b.pos] != 0
70 func (b *Buffer) EncodeUint8(v uint8) {
71 b.buf[b.pos] = byte(v)
75 func (b *Buffer) DecodeUint8() uint8 {
76 v := uint8(b.buf[b.pos])
81 func (b *Buffer) EncodeUint16(v uint16) {
82 binary.BigEndian.PutUint16(b.buf[b.pos:b.pos+2], v)
86 func (b *Buffer) DecodeUint16() uint16 {
87 v := binary.BigEndian.Uint16(b.buf[b.pos : b.pos+2])
92 func (b *Buffer) EncodeUint32(v uint32) {
93 binary.BigEndian.PutUint32(b.buf[b.pos:b.pos+4], v)
97 func (b *Buffer) DecodeUint32() uint32 {
98 v := binary.BigEndian.Uint32(b.buf[b.pos : b.pos+4])
103 func (b *Buffer) EncodeUint64(v uint64) {
104 binary.BigEndian.PutUint64(b.buf[b.pos:b.pos+8], v)
108 func (b *Buffer) DecodeUint64() uint64 {
109 v := binary.BigEndian.Uint64(b.buf[b.pos : b.pos+8])
114 func (b *Buffer) EncodeInt8(v int8) {
115 b.buf[b.pos] = byte(v)
119 func (b *Buffer) DecodeInt8() int8 {
120 v := int8(b.buf[b.pos])
125 func (b *Buffer) EncodeInt16(v int16) {
126 binary.BigEndian.PutUint16(b.buf[b.pos:b.pos+2], uint16(v))
130 func (b *Buffer) DecodeInt16() int16 {
131 v := int16(binary.BigEndian.Uint16(b.buf[b.pos : b.pos+2]))
136 func (b *Buffer) EncodeInt32(v int32) {
137 binary.BigEndian.PutUint32(b.buf[b.pos:b.pos+4], uint32(v))
141 func (b *Buffer) DecodeInt32() int32 {
142 v := int32(binary.BigEndian.Uint32(b.buf[b.pos : b.pos+4]))
147 func (b *Buffer) EncodeInt64(v int64) {
148 binary.BigEndian.PutUint64(b.buf[b.pos:b.pos+8], uint64(v))
152 func (b *Buffer) DecodeInt64() int64 {
153 v := int64(binary.BigEndian.Uint64(b.buf[b.pos : b.pos+8]))
158 func (b *Buffer) EncodeFloat64(v float64) {
159 binary.BigEndian.PutUint64(b.buf[b.pos:b.pos+8], math.Float64bits(v))
163 func (b *Buffer) DecodeFloat64() float64 {
164 v := math.Float64frombits(binary.BigEndian.Uint64(b.buf[b.pos : b.pos+8]))
169 func (b *Buffer) EncodeString(v string, length int) {
171 b.EncodeUint32(uint32(len(v)))
174 copy(b.buf[b.pos:b.pos+length], v)
178 func (b *Buffer) DecodeString(length int) string {
181 length = int(b.DecodeUint32())
182 v = b.buf[b.pos : b.pos+length]
184 v = b.buf[b.pos : b.pos+length]
185 if nul := bytes.Index(v, []byte{0x00}); nul >= 0 {