-
Notifications
You must be signed in to change notification settings - Fork 37
/
format_bits.go
68 lines (63 loc) · 1.6 KB
/
format_bits.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package models
import (
"fmt"
"strings"
)
func GetBitsFormatted(value interface{}, flags Format) (v Value) {
v.Format = flags
v.Raw = value
if flags&FormatBits != 0 {
if bytes, ok := value.([]byte); ok {
v.Formatted = fmt.Sprintf("% X", bytes)
}
}
return
}
func GetBitsFormatter(flags Format) (f ValueFormatter) {
return func(value interface{}) Value {
return GetBitsFormatted(value, flags)
}
}
func GetEnumBitsFormatted(value interface{}, flags Format, enum *Enum) (v Value) {
v.Format = flags
v.Raw = value
if flags == FormatNone {
return
}
octets := value.([]byte)
if flags&FormatBits != 0 {
v.Formatted = fmt.Sprintf("% X", octets)
}
if (flags&FormatEnumName)+(flags&FormatEnumValue) == 0 {
return
}
bitsFormatted := make([]string, 0, 8*len(octets))
for i, octet := range octets {
for j := 7; j >= 0; j-- {
if octet&(1<<uint(j)) != 0 {
bit := uint64(8*i + (7 - j))
var bitFormatted string
if flags&FormatEnumName != 0 {
bitFormatted = enum.Name(int64(bit))
if flags&FormatEnumValue != 0 || bitFormatted == "unknown" {
bitFormatted += "(" + fmt.Sprintf("%d", bit) + ")"
}
} else if flags&FormatEnumValue != 0 {
bitFormatted = fmt.Sprintf("%d", bit)
}
bitsFormatted = append(bitsFormatted, bitFormatted)
}
}
}
if v.Formatted == "" {
v.Formatted = strings.Join(bitsFormatted, " ")
} else {
v.Formatted += "[" + strings.Join(bitsFormatted, " ") + "]"
}
return
}
func GetEnumBitsFormatter(flags Format, enum *Enum) (f ValueFormatter) {
return func(value interface{}) Value {
return GetEnumBitsFormatted(value, flags, enum)
}
}