byteio - bigendianreader_varint.go
1 package byteio
2
3 // ReadUintX reads an unsinged integer that was encoded using a variable number
4 // of bytes
5 func (e *BigEndianReader) ReadUintX() (uint64, int, error) {
6 c, err := e.ReadByte()
7 if err != nil {
8 return 0, 0, err
9 }
10 val := uint64(c) & 0x7f
11 n := 1
12 for ; c&0x80 != 0 && n < 9; n++ {
13 c, err = e.ReadByte()
14 if err != nil {
15 return 0, n, err
16 }
17 val++
18 if n == 8 && c&0x80 > 0 {
19 val = (val << 8) | uint64(c)
20 } else {
21 val = (val << 7) | uint64(c&0x7f)
22 }
23 }
24 return val, n, nil
25 }
26
27 // ReadIntX reads an integer that was encoded using a variable number of bytes
28 func (e *BigEndianReader) ReadIntX() (int64, int, error) {
29 i, n, err := e.ReadUintX()
30 return unzigzag(i), n, err
31 }
32