byteorder.mx raw

   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.
   7  package byteorder
   8  
   9  func 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  
  14  func 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  
  20  func LEAppendUint16(b []byte, v uint16) []byte {
  21  	return append(b,
  22  		byte(v),
  23  		byte(v>>8),
  24  	)
  25  }
  26  
  27  func 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  
  32  func 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  
  40  func 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  
  49  func 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  
  55  func 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  
  67  func 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  
  80  func 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  
  85  func 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  
  91  func BEAppendUint16(b []byte, v uint16) []byte {
  92  	return append(b,
  93  		byte(v>>8),
  94  		byte(v),
  95  	)
  96  }
  97  
  98  func 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  
 103  func 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  
 111  func 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  
 120  func 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  
 126  func 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  
 138  func 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