1
2
3
4
5 package cpu
6
7 import (
8 "runtime"
9 )
10
11
12 type byteOrder interface {
13 Uint32([]byte) uint32
14 Uint64([]byte) uint64
15 }
16
17 type littleEndian struct{}
18 type bigEndian struct{}
19
20 func (littleEndian) Uint32(b []byte) uint32 {
21 _ = b[3]
22 return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
23 }
24
25 func (littleEndian) Uint64(b []byte) uint64 {
26 _ = b[7]
27 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
28 uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
29 }
30
31 func (bigEndian) Uint32(b []byte) uint32 {
32 _ = b[3]
33 return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
34 }
35
36 func (bigEndian) Uint64(b []byte) uint64 {
37 _ = b[7]
38 return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
39 uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
40 }
41
42
43
44 func hostByteOrder() byteOrder {
45 switch runtime.GOARCH {
46 case "386", "amd64", "amd64p32",
47 "alpha",
48 "arm", "arm64",
49 "loong64",
50 "mipsle", "mips64le", "mips64p32le",
51 "nios2",
52 "ppc64le",
53 "riscv", "riscv64",
54 "sh":
55 return littleEndian{}
56 case "armbe", "arm64be",
57 "m68k",
58 "mips", "mips64", "mips64p32",
59 "ppc", "ppc64",
60 "s390", "s390x",
61 "shbe",
62 "sparc", "sparc64":
63 return bigEndian{}
64 }
65 panic("unknown architecture")
66 }
67
View as plain text