forked from parsyl/parquet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bitpack.go
139 lines (128 loc) · 2.75 KB
/
bitpack.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package bitpack
// This code is generated by github.com/parsyl/parquet.
func Pack(width int, vals []uint8) []byte {
switch width {
case 1:
return pack1(vals)
case 2:
return pack2(vals)
case 3:
return pack3(vals)
case 4:
return pack4(vals)
default:
return []byte{}
}
}
func pack1(vals []uint8) []byte {
return []byte{
(byte((vals[0]&1)<<0) |
byte((vals[1]&1)<<1) |
byte((vals[2]&1)<<2) |
byte((vals[3]&1)<<3) |
byte((vals[4]&1)<<4) |
byte((vals[5]&1)<<5) |
byte((vals[6]&1)<<6) |
byte((vals[7]&1)<<7)),
}
}
func pack2(vals []uint8) []byte {
return []byte{
(byte((vals[0]&3)<<0) |
byte((vals[1]&3)<<2) |
byte((vals[2]&3)<<4) |
byte((vals[3]&3)<<6)),
(byte((vals[4]&3)<<0) |
byte((vals[5]&3)<<2) |
byte((vals[6]&3)<<4) |
byte((vals[7]&3)<<6)),
}
}
func pack3(vals []uint8) []byte {
return []byte{
(byte((vals[0]&7)<<0) |
byte((vals[1]&7)<<3) |
byte((vals[2]&3)<<6)),
(byte((vals[2]&4)>>2) |
byte((vals[3]&7)<<1) |
byte((vals[4]&7)<<4) |
byte((vals[5]&1)<<7)),
(byte((vals[5]&6)>>1) |
byte((vals[6]&7)<<2) |
byte((vals[7]&7)<<5)),
}
}
func pack4(vals []uint8) []byte {
return []byte{
(byte((vals[0]&15)<<0) |
byte((vals[1]&15)<<4)),
(byte((vals[2]&15)<<0) |
byte((vals[3]&15)<<4)),
(byte((vals[4]&15)<<0) |
byte((vals[5]&15)<<4)),
(byte((vals[6]&15)<<0) |
byte((vals[7]&15)<<4)),
}
}
func Unpack(width int, vals []byte) []uint8 {
switch width {
case 1:
return unpack1(vals)
case 2:
return unpack2(vals)
case 3:
return unpack3(vals)
case 4:
return unpack4(vals)
default:
return []uint8{}
}
}
func unpack1(vals []byte) []uint8 {
return []uint8{
(uint8(vals[0]&1) >> 0),
(uint8(vals[0]&2) >> 1),
(uint8(vals[0]&4) >> 2),
(uint8(vals[0]&8) >> 3),
(uint8(vals[0]&16) >> 4),
(uint8(vals[0]&32) >> 5),
(uint8(vals[0]&64) >> 6),
(uint8(vals[0]&128) >> 7),
}
}
func unpack2(vals []byte) []uint8 {
return []uint8{
(uint8(vals[0]&3) >> 0),
(uint8(vals[0]&12) >> 2),
(uint8(vals[0]&48) >> 4),
(uint8(vals[0]&192) >> 6),
(uint8(vals[1]&3) >> 0),
(uint8(vals[1]&12) >> 2),
(uint8(vals[1]&48) >> 4),
(uint8(vals[1]&192) >> 6),
}
}
func unpack3(vals []byte) []uint8 {
return []uint8{
(uint8(vals[0]&7) >> 0),
(uint8(vals[0]&56) >> 3),
(uint8(vals[0]&192) >> 6) | (uint8(vals[1]&1) << 2),
(uint8(vals[1]&14) >> 1),
(uint8(vals[1]&112) >> 4),
(uint8(vals[1]&128) >> 7) | (uint8(vals[2]&3) << 1),
(uint8(vals[2]&28) >> 2),
(uint8(vals[2]&224) >> 5),
}
}
func unpack4(vals []byte) []uint8 {
return []uint8{
(uint8(vals[0]&15) >> 0),
(uint8(vals[0]&240) >> 4),
(uint8(vals[1]&15) >> 0),
(uint8(vals[1]&240) >> 4),
(uint8(vals[2]&15) >> 0),
(uint8(vals[2]&240) >> 4),
(uint8(vals[3]&15) >> 0),
(uint8(vals[3]&240) >> 4),
}
}