mirror of
https://github.com/fumiama/go-simple-protobuf.git
synced 2026-06-05 02:00:33 +08:00
54 lines
912 B
Go
54 lines
912 B
Go
package spb
|
|
|
|
import "io"
|
|
|
|
type SimplePB struct {
|
|
StructLen, RealLen uint32
|
|
Target [][]byte
|
|
}
|
|
|
|
func NewSimplePB(r io.Reader) (s SimplePB, err error) {
|
|
cnt := uint32(0)
|
|
s.StructLen, cnt, err = ReadNum(r)
|
|
if err != nil {
|
|
s.RealLen = uint32(cnt)
|
|
return
|
|
}
|
|
if s.StructLen <= 1 || s.StructLen >= uint32(1)<<20 {
|
|
err = ErrInvalidStructLen
|
|
s.RealLen = uint32(cnt)
|
|
return
|
|
}
|
|
var offset, datalen uint32
|
|
n := uint32(0)
|
|
for i := uint32(0); i < s.StructLen; i += offset {
|
|
offset, n, err = ReadNum(r)
|
|
cnt += n
|
|
if err != nil {
|
|
break
|
|
}
|
|
datalen, n, err = ReadNum(r)
|
|
cnt += n
|
|
if err != nil {
|
|
break
|
|
}
|
|
if datalen == 0 {
|
|
break
|
|
}
|
|
if datalen > offset {
|
|
err = ErrInvalidDataLen
|
|
break
|
|
}
|
|
t := make([]byte, datalen)
|
|
x := 0
|
|
x, err = r.Read(t)
|
|
cnt += uint32(x)
|
|
if err != nil {
|
|
break
|
|
}
|
|
s.Target = append(s.Target, t)
|
|
}
|
|
s.RealLen = uint32(cnt)
|
|
return
|
|
}
|