-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcodec.go
103 lines (83 loc) · 2.22 KB
/
codec.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
// Copyright (C) 2018 Kun Zhong All rights reserved.
// Use of this source code is governed by a MIT-style license that can be found
// in the LICENSE file.
package netgo
import (
"fmt"
"io"
"encoding/binary"
"unsafe"
)
var (
localEndian binary.ByteOrder = getLocalEndian()
)
func getLocalEndian() binary.ByteOrder {
var x uint16 = 0x1
if (*[2]byte)(unsafe.Pointer(&x))[0] == 0 {
return binary.BigEndian
}
return binary.LittleEndian
}
func swap_2(to []byte, from []byte) {
to[0], to[1] = from[1], from[0]
}
func swap_4(to []byte, from []byte) {
to[0], to[1], to[2], to[3] = from[3], from[2], from[1], from[0]
}
func swap_8(to []byte, from []byte) {
to[0], to[1], to[2], to[3], to[4], to[5], to[6], to[7] = from[7], from[6], from[5], from[4], from[3], from[2], from[1], from[0]
}
func getUint32(reader io.Reader, order binary.ByteOrder) (res uint32, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
_, err = reader.Read((*[4]byte)(unsafe.Pointer(&res))[:])
if err != nil {
return
}
if order != localEndian {
swap_4((*[4]byte)(unsafe.Pointer(&res))[:], (*[4]byte)(unsafe.Pointer(&res))[:])
}
return
}
func putUint32(val uint32, writer io.Writer, order binary.ByteOrder) (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
if order != localEndian {
swap_4((*[4]byte)(unsafe.Pointer(&val))[:], (*[4]byte)(unsafe.Pointer(&val))[:])
}
_, err = writer.Write((*[4]byte)(unsafe.Pointer(&val))[:])
return
}
func getUint64(reader io.Reader, order binary.ByteOrder) (res uint64, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
_, err = reader.Read((*[8]byte)(unsafe.Pointer(&res))[:])
if err != nil {
return
}
if order != localEndian {
swap_8((*[8]byte)(unsafe.Pointer(&res))[:], (*[8]byte)(unsafe.Pointer(&res))[:])
}
return
}
func putUint64(val uint64, writer io.Writer, order binary.ByteOrder) (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
}
}()
if order != localEndian {
swap_8((*[8]byte)(unsafe.Pointer(&val))[:], (*[8]byte)(unsafe.Pointer(&val))[:])
}
_, err = writer.Write((*[8]byte)(unsafe.Pointer(&val))[:])
return
}