summaryrefslogtreecommitdiff
path: root/go/variable-length-quantity/variable_length_quantity.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/variable-length-quantity/variable_length_quantity.go')
-rw-r--r--go/variable-length-quantity/variable_length_quantity.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/go/variable-length-quantity/variable_length_quantity.go b/go/variable-length-quantity/variable_length_quantity.go
new file mode 100644
index 0000000..9df99d9
--- /dev/null
+++ b/go/variable-length-quantity/variable_length_quantity.go
@@ -0,0 +1,59 @@
+package variablelengthquantity
+
+import (
+ "bytes"
+ "io"
+)
+
+func decodeVarint(r io.ByteReader) (uint32, error) {
+ var i uint32
+ for {
+ b, err := r.ReadByte()
+ if err != nil {
+ return 0, err
+ }
+ i = (i << 7) | uint32(b&0x7f)
+ if b&0x80 == 0 {
+ return i, nil
+ }
+ }
+}
+
+func DecodeVarint(b []byte) ([]uint32, error) {
+ var ret []uint32
+ r := bytes.NewReader(b)
+ for r.Len() > 0 {
+ u, err := decodeVarint(r)
+ if err != nil {
+ return nil, err
+ }
+ ret = append(ret, u)
+ }
+ return ret, nil
+}
+
+func encodeVarint(w io.ByteWriter, u uint32) {
+ if u == 0 {
+ w.WriteByte(0)
+ return
+ }
+ var l int
+ for i := u; i > 0; i >>= 7 {
+ l++
+ }
+ for i := l - 1; i >= 0; i-- {
+ o := byte(u >> uint(i*7) & 0x7f)
+ if i != 0 {
+ o |= 0x80
+ }
+ w.WriteByte(o)
+ }
+}
+
+func EncodeVarint(u []uint32) []byte {
+ w := new(bytes.Buffer)
+ for _, v := range u {
+ encodeVarint(w, v)
+ }
+ return w.Bytes()
+}