1// Copyright 2024 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package byteorder provides functions for decoding and encoding
6// little and big endian integer types from/to byte slices.
7package byteorder
8
9func LeUint16(b []byte) uint16 {
10	_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
11	return uint16(b[0]) | uint16(b[1])<<8
12}
13
14func LePutUint16(b []byte, v uint16) {
15	_ = b[1] // early bounds check to guarantee safety of writes below
16	b[0] = byte(v)
17	b[1] = byte(v >> 8)
18}
19
20func LeAppendUint16(b []byte, v uint16) []byte {
21	return append(b,
22		byte(v),
23		byte(v>>8),
24	)
25}
26
27func LeUint32(b []byte) uint32 {
28	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
29	return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
30}
31
32func LePutUint32(b []byte, v uint32) {
33	_ = b[3] // early bounds check to guarantee safety of writes below
34	b[0] = byte(v)
35	b[1] = byte(v >> 8)
36	b[2] = byte(v >> 16)
37	b[3] = byte(v >> 24)
38}
39
40func LeAppendUint32(b []byte, v uint32) []byte {
41	return append(b,
42		byte(v),
43		byte(v>>8),
44		byte(v>>16),
45		byte(v>>24),
46	)
47}
48
49func LeUint64(b []byte) uint64 {
50	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
51	return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
52		uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
53}
54
55func LePutUint64(b []byte, v uint64) {
56	_ = b[7] // early bounds check to guarantee safety of writes below
57	b[0] = byte(v)
58	b[1] = byte(v >> 8)
59	b[2] = byte(v >> 16)
60	b[3] = byte(v >> 24)
61	b[4] = byte(v >> 32)
62	b[5] = byte(v >> 40)
63	b[6] = byte(v >> 48)
64	b[7] = byte(v >> 56)
65}
66
67func LeAppendUint64(b []byte, v uint64) []byte {
68	return append(b,
69		byte(v),
70		byte(v>>8),
71		byte(v>>16),
72		byte(v>>24),
73		byte(v>>32),
74		byte(v>>40),
75		byte(v>>48),
76		byte(v>>56),
77	)
78}
79
80func BeUint16(b []byte) uint16 {
81	_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
82	return uint16(b[1]) | uint16(b[0])<<8
83}
84
85func BePutUint16(b []byte, v uint16) {
86	_ = b[1] // early bounds check to guarantee safety of writes below
87	b[0] = byte(v >> 8)
88	b[1] = byte(v)
89}
90
91func BeAppendUint16(b []byte, v uint16) []byte {
92	return append(b,
93		byte(v>>8),
94		byte(v),
95	)
96}
97
98func BeUint32(b []byte) uint32 {
99	_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
100	return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
101}
102
103func BePutUint32(b []byte, v uint32) {
104	_ = b[3] // early bounds check to guarantee safety of writes below
105	b[0] = byte(v >> 24)
106	b[1] = byte(v >> 16)
107	b[2] = byte(v >> 8)
108	b[3] = byte(v)
109}
110
111func BeAppendUint32(b []byte, v uint32) []byte {
112	return append(b,
113		byte(v>>24),
114		byte(v>>16),
115		byte(v>>8),
116		byte(v),
117	)
118}
119
120func BeUint64(b []byte) uint64 {
121	_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
122	return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
123		uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
124}
125
126func BePutUint64(b []byte, v uint64) {
127	_ = b[7] // early bounds check to guarantee safety of writes below
128	b[0] = byte(v >> 56)
129	b[1] = byte(v >> 48)
130	b[2] = byte(v >> 40)
131	b[3] = byte(v >> 32)
132	b[4] = byte(v >> 24)
133	b[5] = byte(v >> 16)
134	b[6] = byte(v >> 8)
135	b[7] = byte(v)
136}
137
138func BeAppendUint64(b []byte, v uint64) []byte {
139	return append(b,
140		byte(v>>56),
141		byte(v>>48),
142		byte(v>>40),
143		byte(v>>32),
144		byte(v>>24),
145		byte(v>>16),
146		byte(v>>8),
147		byte(v),
148	)
149}
150