-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbits.go
More file actions
86 lines (72 loc) · 2.01 KB
/
bits.go
File metadata and controls
86 lines (72 loc) · 2.01 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package dvb
import (
"encoding/binary"
"reflect"
"unsafe"
)
// var (
// byteOrder binary.ByteOrder = binary.LittleEndian
// )
func bool2byte(v bool) uint8 {
if v {
return 1
}
return 0
}
func byte2bool(v uint8) bool {
return v > 0
}
// make slice of uint16 from slice of uint8
func sliceU8toU16LE(uint8Data []uint8) []uint16 {
// TODO: add a guard againts panicking with "index out of range" when making uint16 value
uint16data := make([]uint16, len(uint8Data)/2)
for i := 0; i < len(uint8Data); i += 2 {
// nolint gosec
uint16data[i/2] = binary.LittleEndian.Uint16(uint8Data[i:])
}
return uint16data
}
func sliceU8toU16BE(uint8Data []uint8) []uint16 {
// TODO: add a guard againts panicking with "index out of range" when making uint16 value
uint16data := make([]uint16, len(uint8Data)/2)
for i := 0; i < len(uint8Data); i += 2 {
// nolint gosec
uint16data[i/2] = binary.BigEndian.Uint16(uint8Data[i:])
}
return uint16data
}
// make slice of uint16 from slice of uint8
func sliceU8toU16LEUnsafe(uint8Data []uint8) []uint16 {
// TODO: fix behaviour with len(buf) % 2 != 0
// nolint unsafeptr
header := (*reflect.SliceHeader)(unsafe.Pointer(&uint8Data))
header.Len /= 2
header.Cap /= 2
// nolint unsafeptr
return *(*[]uint16)(unsafe.Pointer(header))
}
func U16toU8LE(v uint16) []uint8 {
uint8Data := make([]byte, 2)
binary.LittleEndian.PutUint16(uint8Data, v)
return uint8Data
}
func U16toU8BE(v uint16) []uint8 {
uint8Data := make([]byte, 2)
binary.BigEndian.PutUint16(uint8Data, v)
return uint8Data
}
// make slice of uint8 from slice of uint16
func sliceU16toU8LE(uint16Data []uint16) []uint8 {
uint8Data := make([]uint8, len(uint16Data)*2)
for i, val := range uint16Data {
binary.LittleEndian.PutUint16(uint8Data[i*2:(i*2)+2], val)
}
return uint8Data
}
// make slice of uint8 from slice of uint16
func sliceU16toU8Unsafe(uint16Data []uint16) []uint8 {
header := (*reflect.SliceHeader)(unsafe.Pointer(&uint16Data))
header.Len *= 2
header.Cap *= 2
return *(*[]uint8)(unsafe.Pointer(header))
}