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