aboutsummaryrefslogtreecommitdiff
path: root/ber/bits.go
blob: 180228d869bb0612179dd99d34a6bd24c2eb6012 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package ber

// BitString
type Bits []bool

func UnmarshalBitString(b []byte) (bs Bits) {
	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 Bits) (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 Bits) 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
}