aboutsummaryrefslogtreecommitdiff
path: root/ber/bitstring.go
diff options
context:
space:
mode:
Diffstat (limited to 'ber/bitstring.go')
-rw-r--r--ber/bitstring.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/ber/bitstring.go b/ber/bitstring.go
new file mode 100644
index 0000000..2195143
--- /dev/null
+++ b/ber/bitstring.go
@@ -0,0 +1,48 @@
+package ber
+
+// BitString
+type BitString []bool
+
+func UnmarshalBitString(b []byte) (bs BitString) {
+ padding := int(b[0])
+ length := (len(b)-1)*8 - padding
+ for i := 0; i < length; i++ {
+ x := 1 + i/8
+ y := 7 - uint(i%8)
+ bit := b[x]&(1<<y) != 0
+ bs = append(bs, bit)
+ }
+ return
+}
+
+func MarshalBitString(bs BitString) (b []byte) {
+ padding := (8 - len(bs)%8) % 8
+ length := len(bs) / 8
+ if padding != 0 {
+ length++
+ }
+ b = make([]byte, length+1)
+ b[0] = byte(padding)
+ for i, bi := range bs {
+ x := 1 + i/8
+ y := 7 - uint(i%8)
+ if bi {
+ b[x] |= 1 << y
+ }
+ }
+ return
+}
+
+func (bs BitString) String() (s string) {
+ bmap := map[bool]string{
+ true: "1",
+ false: "0",
+ }
+ for i, bit := range bs {
+ if i > 0 && i%4 == 0 {
+ s += " "
+ }
+ s += bmap[bit]
+ }
+ return
+}