-
Notifications
You must be signed in to change notification settings - Fork 1
/
binary.go
151 lines (144 loc) · 3.8 KB
/
binary.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
140
141
142
143
144
145
146
147
148
149
150
151
package gbytes
import (
"bytes"
"encoding/binary"
"github.com/cryptowilliam/goutil/basic/gerrors"
"github.com/cryptowilliam/goutil/container/gany"
"unsafe"
)
func BytesToUint32(b []byte) (uint32, error) {
if len(b) != 4 {
return 0, gerrors.New("b len %d != expected len 4", len(b))
}
var num uint32
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
}
func BytesToUint64(b []byte) (uint64, error) {
if len(b) != 8 {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
var num uint64
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
}
func BytesToInt32(b []byte) (int32, error) {
if len(b) != 4 {
return 0, gerrors.New("b len %d != expected len 4", len(b))
}
var num int32
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
}
func BytesToInt64(b []byte) (int64, error) {
if len(b) != 8 {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
var num int64
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
}
func BytesToNum(b []byte, numTypeSample interface{}) (interface{}, error) {
if len(b) != 8 {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
/*var num int64
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil*/
ntsType := gany.Type(numTypeSample)
switch ntsType {
case "uint8":
if len(b) != 1 {
return 0, gerrors.New("b len %d != expected len 1", len(b))
}
var num uint8
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "uint16":
if len(b) != 2 {
return 0, gerrors.New("b len %d != expected len 2", len(b))
}
var num uint16
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "uint32":
if len(b) != 4 {
return 0, gerrors.New("b len %d != expected len 4", len(b))
}
var num uint32
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "uint64":
if len(b) != 8 {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
var num uint64
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "int8":
if len(b) != 1 {
return 0, gerrors.New("b len %d != expected len 1", len(b))
}
var num int8
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "int16":
if len(b) != 2 {
return 0, gerrors.New("b len %d != expected len 2", len(b))
}
var num int16
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "int32":
if len(b) != 4 {
return 0, gerrors.New("b len %d != expected len 4", len(b))
}
var num int32
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "int64":
if len(b) != 8 {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
var num int64
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
case "int":
if len(b) != int(unsafe.Sizeof(int(1))) {
return 0, gerrors.New("b len %d != expected len 8", len(b))
}
var num int
if err := binary.Read(bytes.NewBuffer(b[:]), binary.LittleEndian, &num); err != nil {
return 0, err
}
return num, nil
default:
return 0, gerrors.New("unsupported type %s", ntsType)
}
}