You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.4 KiB
Go

package bluetooth
import "errors"
// MAC represents a MAC address, in little endian format.
type MAC [6]byte
var errInvalidMAC = errors.New("bluetooth: failed to parse MAC address")
// ParseMAC parses the given MAC address, which must be in 11:22:33:AA:BB:CC
// format. If it cannot be parsed, an error is returned.
func ParseMAC(s string) (mac MAC, err error) {
macIndex := 11
for i := 0; i < len(s); i++ {
c := s[i]
if c == ':' {
continue
}
var nibble byte
if c >= '0' && c <= '9' {
nibble = c - '0' + 0x0
} else if c >= 'A' && c <= 'F' {
nibble = c - 'A' + 0xA
} else {
err = errInvalidMAC
return
}
if macIndex < 0 {
err = errInvalidMAC
return
}
if macIndex%2 == 0 {
mac[macIndex/2] |= nibble
} else {
mac[macIndex/2] |= nibble << 4
}
macIndex--
}
if macIndex != -1 {
err = errInvalidMAC
}
return
}
// String returns a human-readable version of this MAC address, such as
// 11:22:33:AA:BB:CC.
func (mac MAC) String() string {
// TODO: make this more efficient.
s := ""
for i := 5; i >= 0; i-- {
c := mac[i]
// Insert a hyphen at the correct locations.
if i != 5 {
s += ":"
}
// First nibble.
nibble := c >> 4
if nibble <= 9 {
s += string(nibble + '0')
} else {
s += string(nibble + 'A' - 10)
}
// Second nibble.
nibble = c & 0x0f
if nibble <= 9 {
s += string(nibble + '0')
} else {
s += string(nibble + 'A' - 10)
}
}
return s
}