aboutsummaryrefslogtreecommitdiff
path: root/ber
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-06-26 20:03:43 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-06-26 20:03:43 +0200
commitc5b32db26a2dc043bf0777f9f9532e4c360241b2 (patch)
tree08c4cdf16768b95343bc376ba2b9902ab5e0a5cf /ber
parent04a9aaff365419eeb828cfc3ca8b084dcaf3707d (diff)
Add base128
Diffstat (limited to 'ber')
-rw-r--r--ber/obj.go18
-rw-r--r--ber/obj_test.go18
2 files changed, 34 insertions, 2 deletions
diff --git a/ber/obj.go b/ber/obj.go
index e9db78c..735ef97 100644
--- a/ber/obj.go
+++ b/ber/obj.go
@@ -1,7 +1,21 @@
package ber
-func base128(i int) (b []byte) {
- return b
+func base128(n int) (b []byte) {
+ l := 0
+
+ for i := n; i > 0; i >>= 7 {
+ l++
+ }
+
+ for i := l - 1; i >= 0; i-- {
+ o := byte(n >> uint(i*7))
+ o &= 0x7F
+ if i != 0 {
+ o |= 0x80
+ }
+ b = append(b, o)
+ }
+ return
}
func debase128(b []byte) int {
diff --git a/ber/obj_test.go b/ber/obj_test.go
index 995db5c..73cc3f5 100644
--- a/ber/obj_test.go
+++ b/ber/obj_test.go
@@ -1 +1,19 @@
package ber
+
+import (
+ "testing"
+ "bytes"
+)
+
+func testBase128(t *testing.T, n int, e []byte) {
+ a := base128(n)
+ if !bytes.Equal(a, e) {
+ t.Error("Base128", n, "expexted", e, "got", a)
+ }
+}
+
+func TestBase128(t *testing.T) {
+ testBase128(t, 643, []byte{0x85, 0x03})
+ testBase128(t, 113549, []byte{0x86, 0xF7, 0x0D})
+ testBase128(t, 49152, []byte{0x83, 0x80, 0x00})
+}