-
Notifications
You must be signed in to change notification settings - Fork 38
/
binary.go
58 lines (50 loc) · 1.22 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
package raknet
import (
"bytes"
"io"
)
// uint24 represents an integer existing out of 3 bytes. It is actually a
// uint32, but is an alias for the sake of clarity.
type uint24 uint32
// Inc increments a uint24 and returns the old value.
func (u *uint24) Inc() (old uint24) {
ret := *u
*u += 1
return ret
}
// readUint24 reads 3 bytes from the buffer passed and combines it into a
// uint24. If there were no 3 bytes to read, an error is returned.
func readUint24(buf *bytes.Buffer) (uint24, error) {
b := make([]byte, 3)
if _, err := buf.Read(b); err != nil {
return 0, io.ErrUnexpectedEOF
}
return loadUint24(b), nil
}
// loadUint24 interprets the first 3 bytes in b as a uint24.
func loadUint24(b []byte) uint24 {
return uint24(b[0]) | (uint24(b[1]) << 8) | (uint24(b[2]) << 16)
}
// writeUint24 writes a uint24 to the buffer passed as 3 bytes. If not
// successful, an error is returned.
func writeUint24(b *bytes.Buffer, v uint24) {
b.Write([]byte{
byte(v),
byte(v >> 8),
byte(v >> 16),
})
}
func writeUint16(b *bytes.Buffer, v uint16) {
b.Write([]byte{
byte(v >> 8),
byte(v),
})
}
func writeUint32(b *bytes.Buffer, v uint32) {
b.Write([]byte{
byte(v >> 24),
byte(v >> 16),
byte(v >> 8),
byte(v),
})
}