Skip to content

Commit c6db663

Browse files
committed
support raw bytes tag
1 parent d77ff0d commit c6db663

File tree

5 files changed

+61
-46
lines changed

5 files changed

+61
-46
lines changed

pkg/spec/decode.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,15 @@ func FromBytes(buf []byte) (p *Packet, err error) {
1515
p = &Packet{buffer: buf}
1616
pos := 0
1717

18-
// read Tag
19-
var tag uint64
20-
cursor, err := readTag(buf, pos, &tag)
21-
if err != nil {
22-
return nil, err
23-
}
24-
p.Tag = tag
18+
// read Tag Buffer, Tag support PVarUInt64 and raw bytes
19+
// if tagbuf is empty, then check idTag value
20+
cursor := readVariantLengthBuffer(buf, pos)
2521
p.tagbuf = buf[pos:cursor]
2622
pos = cursor
2723

2824
// read Length
2925
var length uint64
30-
cursor, err = readLength(buf, pos, &length)
26+
cursor, err = readPVarUInt64(buf, pos, &length)
3127
if err != nil {
3228
return nil, err
3329
}
@@ -45,19 +41,21 @@ func FromBytes(buf []byte) (p *Packet, err error) {
4541
return p, nil
4642
}
4743

48-
func readTag(buffer []byte, position int, val *uint64) (cursor int, err error) {
49-
cursor, err = readPVarUInt64(buffer, position, val)
50-
return cursor, err
51-
}
52-
53-
func readLength(buffer []byte, position int, val *uint64) (cursor int, err error) {
54-
cursor, err = readPVarUInt64(buffer, position, val)
55-
return cursor, err
44+
func readVariantLengthBuffer(buffer []byte, position int) int {
45+
buf := buffer[position:]
46+
// PVarUInt64 type, MSB(0x80) is continuation bit
47+
cursor := 1
48+
for i, v := range buf {
49+
if v&0x80 != 0x80 {
50+
cursor += i
51+
break
52+
}
53+
}
54+
return cursor
5655
}
5756

5857
func readPVarUInt64(buffer []byte, position int, val *uint64) (cursor int, err error) {
5958
buf := buffer[position:]
60-
6159
// tag/length is PVarUInt64 type, MSB(0x80) is continuation bit
6260
cursor = 1
6361
for i, v := range buf {
@@ -66,10 +64,8 @@ func readPVarUInt64(buffer []byte, position int, val *uint64) (cursor int, err e
6664
break
6765
}
6866
}
69-
7067
// generate tag buffer
7168
bytes := buf[:cursor]
72-
7369
// read as PVarInt64
7470
codec := encoding.VarCodec{}
7571
err = codec.DecodePVarUInt64(bytes, val)

pkg/spec/encode.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
// NewPacket create new Packet object
88
func NewPacket(sid uint64) (*Packet, error) {
99
var p = &Packet{}
10-
tmp, err := writePVarUInt64Buffer(sid)
10+
tmp, err := getPVarUInt64Buffer(sid)
1111
p.tagbuf = tmp
1212
return p, err
1313
}
@@ -20,21 +20,6 @@ func NewRawPacket(rawID []byte) (*Packet, error) {
2020
return p, nil
2121
}
2222

23-
func (p *Packet) setLengthBuffer() error {
24-
len := uint64(p.Length)
25-
tmp, err := writePVarUInt64Buffer(len)
26-
p.lenbuf = tmp
27-
return err
28-
}
29-
30-
func writePVarUInt64Buffer(val uint64) ([]byte, error) {
31-
size := encoding.SizeOfPVarUInt64(val)
32-
codec := encoding.VarCodec{Size: size}
33-
buf := make([]byte, size)
34-
err := codec.EncodePVarUInt64(buf, val)
35-
return buf, err
36-
}
37-
3823
// SetNil set nil value, means length=0 packet
3924
func (p *Packet) SetNil() {
4025
p.valbuf = make([]byte, 0)
@@ -149,13 +134,33 @@ func (p *Packet) AddNode(child *Packet) (*Packet, error) {
149134

150135
// Encode return whole bytes of this packet
151136
func (p *Packet) Encode() ([]byte, error) {
137+
// if tag buffer is none, read from idTag as PVarUint64 type
138+
if len(p.tagbuf) < 1 {
139+
tagbuf, err := getPVarUInt64Buffer(p.idTag)
140+
if err != nil {
141+
return nil, err
142+
}
143+
p.tagbuf = tagbuf
144+
}
145+
146+
// set length buffer
152147
p.Length = uint64(len(p.valbuf))
153-
err := p.setLengthBuffer()
148+
lenbuf, err := getPVarUInt64Buffer(p.Length)
149+
p.lenbuf = lenbuf
154150
if err != nil {
155151
return nil, err
156152
}
153+
// [Tag][Length][Value]
157154
res := append(p.tagbuf, p.lenbuf...)
158155
res = append(res, p.valbuf...)
159156
p.buffer = res
160157
return res, nil
161158
}
159+
160+
func getPVarUInt64Buffer(val uint64) ([]byte, error) {
161+
size := encoding.SizeOfPVarUInt64(val)
162+
codec := encoding.VarCodec{Size: size}
163+
buf := make([]byte, size)
164+
err := codec.EncodePVarUInt64(buf, val)
165+
return buf, err
166+
}

pkg/spec/packet.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,22 @@ package spec
22

33
// Packet is a TLV group
44
type Packet struct {
5-
Tag uint64
65
Length uint64
76
tagbuf []byte
87
lenbuf []byte
98
valbuf []byte
109
buffer []byte
10+
idTag uint64
11+
}
12+
13+
// GetTag return Tag as uint64 value
14+
func (p *Packet) GetTag() uint64 {
15+
var tag uint64
16+
readPVarUInt64(p.tagbuf, 0, &tag)
17+
return tag
18+
}
19+
20+
// GetRawTag return Tag as raw bytes
21+
func (p *Packet) GetRawTag() []byte {
22+
return p.tagbuf
1123
}

pkg/spec/tlv_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ func TestV2AddNode(t *testing.T) {
3636
}
3737

3838
func TestFromBytes(t *testing.T) {
39-
testFromBytes(t, []byte{0x03, 0x01, 0x02}, &Packet{Tag: 3, Length: 1, valbuf: []byte{0x02}})
40-
testFromBytes(t, []byte{0x81, 0x03, 0x01, 0x06}, &Packet{Tag: 131, Length: 1, valbuf: []byte{0x06}})
39+
testFromBytes(t, []byte{0x03, 0x01, 0x02}, &Packet{idTag: 3, Length: 1, valbuf: []byte{0x02}})
40+
testFromBytes(t, []byte{0x81, 0x03, 0x01, 0x06}, &Packet{idTag: 131, Length: 1, valbuf: []byte{0x06}})
4141

4242
foo := make([]byte, 129)
4343
bar := []byte{0x81, 0x03, 0x81, 0x01}
4444
buf := append(bar, foo...)
45-
testFromBytes(t, buf, &Packet{Tag: 131, Length: 129, valbuf: foo})
45+
testFromBytes(t, buf, &Packet{idTag: 131, Length: 129, valbuf: foo})
4646
}
4747

4848
func TestReadTag(t *testing.T) {
@@ -62,7 +62,7 @@ func TestReadLength(t *testing.T) {
6262

6363
func testReadTag(t *testing.T, buffer []byte, position int, expectValue uint64, expectedCursor int) {
6464
var result uint64
65-
cursor, err := readTag(buffer, position, &result)
65+
cursor, err := readPVarUInt64(buffer, position, &result)
6666
if err != nil {
6767
t.Error(err)
6868
}
@@ -76,7 +76,7 @@ func testReadTag(t *testing.T, buffer []byte, position int, expectValue uint64,
7676

7777
func testReadLength(t *testing.T, buffer []byte, position int, expectValue uint64, expectedCursor int) {
7878
var result uint64
79-
cursor, err := readLength(buffer, position, &result)
79+
cursor, err := readPVarUInt64(buffer, position, &result)
8080
if err != nil {
8181
t.Errorf(">>> Got err=%s", err.Error())
8282
}
@@ -89,12 +89,14 @@ func testReadLength(t *testing.T, buffer []byte, position int, expectValue uint6
8989
}
9090

9191
func testFromBytes(t *testing.T, buffer []byte, expected *Packet) {
92+
expected.Encode()
9293
res, err := FromBytes(buffer)
94+
// t.Logf("testFromBytes: res=%v, exptected=%v", res, expected)
9395
if err != nil {
9496
t.Error(err)
9597
} else {
96-
if res.Tag != expected.Tag {
97-
t.Errorf("Tag expected=[% X], actual=[% X]", expected.Tag, res.Tag)
98+
if res.GetTag() != expected.GetTag() {
99+
t.Errorf("Tag expected=[% X], actual=[% X]", expected.GetTag(), res.GetTag())
98100
}
99101
if res.Length != expected.Length {
100102
t.Errorf("Length expected=[% X], actual=[% X]", expected.Length, res.Length)

pkg/spec/typed_value_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ func TestV2Nil(t *testing.T) {
1111
buf := compareBytes(t, p, []byte{0xFE, 0x7F, 0x00})
1212

1313
dp, _ := FromBytes(buf)
14-
if dp.Tag != 18446744073709551487 {
15-
t.Errorf("result.Tag=% X, expect.Tag=% X", dp.Tag, uint64(18446744073709551487))
14+
if dp.GetTag() != 18446744073709551487 {
15+
t.Errorf("result.Tag=% X, expect.Tag=% X", dp.GetTag(), uint64(18446744073709551487))
1616
}
1717

1818
if dp.Length != 0 {

0 commit comments

Comments
 (0)