byteio - membigendian_varint.go
1 package byteio
2
3 // WriteUintX writes the unsigned integer using a variable number of bytes.
4 func (e *MemBigEndian) WriteUintX(d uint64) {
5 pos := 8
6 var buffer [9]byte
7
8 if d > 9295997013522923647 {
9 buffer[8] = byte(d)
10 d >>= 8
11 } else {
12 buffer[8] = byte(d & 0x7f)
13 d >>= 7
14 }
15
16 for ; d > 0; d >>= 7 {
17 pos--
18 d--
19 buffer[pos] = byte(d&0x7f) | 0x80
20 }
21
22 e.WriteBytes(buffer[pos:])
23 }
24
25 // WriteIntX writes the integer using a variable number of bytes.
26 func (e *MemBigEndian) WriteIntX(d int64) {
27 e.WriteUintX(zigzag(d))
28 }
29
30 // ReadUintX reads an unsigned integer that was encoded using a variable number
31 // of bytes.
32 func (e *MemBigEndian) ReadUintX() uint64 {
33 c := e.ReadUint8()
34 val := uint64(c) & 0x7f
35
36 for n := 1; c&0x80 != 0 && n < 9; n++ {
37 c = e.ReadUint8()
38 val++
39
40 if n == 8 && c&0x80 > 0 {
41 val = (val << 8) | uint64(c)
42 } else {
43 val = (val << 7) | uint64(c&0x7f)
44 }
45 }
46
47 return val
48 }
49
50 // ReadIntX reads an integer that was encoded using a variable number of bytes.
51 func (e *MemBigEndian) ReadIntX() int64 {
52 return unzigzag(e.ReadUintX())
53 }
54