Source file src/internal/byteorder/byteorder.go

     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  

View as plain text