/
beacon.go
37 lines (32 loc) · 993 Bytes
/
beacon.go
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
package gou
import (
"fmt"
"math"
"strconv"
)
// major: 16 bit unsigned integer (0~65535)
// minor: 16 bit unsigned integer (0~65535)
// Beacon Bit
const (
BitTotal = 32
)
// PackIBeacon is pack major, minor values
// params x, y is sequence value (24bit, 8bit)
// returns major, minor is real beacon value (16bit, 16bit)
func PackBeacon(x, y int, minorBit uint) (int, int) {
s := fmt.Sprintf("%024b%08b", x, y)
sum, _ := strconv.ParseInt(s, 2, 0)
major := int(sum >> (minorBit + uint(BitTotal/2-minorBit)))
minor := int(sum) & int(math.Pow(2, BitTotal/2)-1)
return major, minor
}
// UnpackIBeacon is unpack major, minor values
// params x, y is real beacon value (16bit, 16bit)
// returns major, minor is sequence value (24bit, 8bit)
func UnpackBeacon(x, y int, minorBit uint) (int, int) {
s := fmt.Sprintf("%016b%016b", x, y)
sum, _ := strconv.ParseInt(s, 2, 0)
major := int(sum) >> minorBit
minor := int(sum) & int(math.Pow(2, float64(minorBit))-1)
return major, minor
}