-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhighlevelreader.go
114 lines (96 loc) · 3.19 KB
/
highlevelreader.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
package gobinary
import (
"encoding/binary"
"io"
"math"
)
type HighLevelReader struct {
io.Reader
buffer []byte
}
func MakeHighLevelReader(reader io.Reader) HighLevelReader {
return HighLevelReader{
Reader: reader,
buffer: make([]byte, 0, 16),
}
}
func (hlr *HighLevelReader) getReadBuffer(length int) []byte {
if cap(hlr.buffer) < length {
c := 2*length + 1
if c < 16 {
c = 16
}
hlr.buffer = make([]byte, length, c)
} else {
hlr.buffer = hlr.buffer[0:length]
}
_, err := hlr.Reader.Read(hlr.buffer)
if err != nil {
panic(err.Error())
}
return hlr.buffer
}
// ReadInt64 reads a 64bit integer from the stream.
func (hlr *HighLevelReader) ReadInt64() int64 {
return int64(binary.LittleEndian.Uint64(hlr.getReadBuffer(8)))
}
// ReadInt32 reads a 32bit integer from the stream.
func (hlr *HighLevelReader) ReadInt32() int32 {
return int32(binary.LittleEndian.Uint32(hlr.getReadBuffer(4)))
}
// ReadInt16 reads a 16bit integer from the stream.
func (hlr *HighLevelReader) ReadInt16() int16 {
return int16(binary.LittleEndian.Uint16(hlr.getReadBuffer(2)))
}
// ReadInt8 reads an 8bit integer from the stream.
func (hlr *HighLevelReader) ReadInt8() int8 {
return int8(hlr.getReadBuffer(1)[0])
}
// ReadUInt64 reads a 64bit unsigned integer from the stream.
func (hlr *HighLevelReader) ReadUInt64() uint64 {
return binary.LittleEndian.Uint64(hlr.getReadBuffer(8))
}
// ReadUInt32 reads a 32bit unsigned integer from the stream.
func (hlr *HighLevelReader) ReadUInt32() uint32 {
return binary.LittleEndian.Uint32(hlr.getReadBuffer(4))
}
// ReadUInt16 reads a 16bit unsigned integer from the stream.
func (hlr *HighLevelReader) ReadUInt16() uint16 {
return binary.LittleEndian.Uint16(hlr.getReadBuffer(2))
}
// ReadUInt8 reads a 8bit unsigned integer from the stream.
func (hlr *HighLevelReader) ReadUInt8() uint8 {
return uint8(hlr.getReadBuffer(1)[0])
}
// ReadByte reads a single byte from the underlying stream.
func (hlr *HighLevelReader) ReadByte() byte {
return hlr.getReadBuffer(1)[0]
}
// ReadFloat32 reads a 32bit floating point value in IEEE754 format
// from the underlying stream.
func (hlr *HighLevelReader) ReadFloat32() float32 {
return math.Float32frombits(hlr.ReadUInt32())
}
// ReadFloat64 reads a 64bit floating point value in IEEE754 format
// from the underlying stream.
func (hlr *HighLevelReader) ReadFloat64() float64 {
return math.Float64frombits(hlr.ReadUInt64())
}
// ReadBool reads a boolean value from the underlying stream. Booleans
// are encoded as single byte with a value of 0 encoding false.
func (hlr *HighLevelReader) ReadBool() bool {
return hlr.getReadBuffer(1)[0] > 0
}
// ReadString reads a UTF8 encoded string of the given number of bytes (not runes!)
// from the underlying stream.
func (hlr *HighLevelReader) ReadString(length int) string {
return string(hlr.getReadBuffer(length))
}
// ReadBytes reads as many bytes as the passed in byte slice is long into said byte
// slice. Returns the number of bytes read.
func (hlr *HighLevelReader) ReadBytes(output []byte) int {
l := len(output)
tmp := hlr.getReadBuffer(l)
copy(output, tmp)
return len(tmp)
}