github.com/3andne/restls-client-go@v0.1.6/quicvarint/quicvarint.go (about)

     1  package quicvarint
     2  
     3  import "fmt"
     4  
     5  // taken from the QUIC draft
     6  const (
     7  	// Min is the minimum value allowed for a QUIC varint.
     8  	Min = 0
     9  
    10  	// Max is the maximum allowed value for a QUIC varint (2^62-1).
    11  	Max = maxVarInt8
    12  
    13  	maxVarInt1 = 63
    14  	maxVarInt2 = 16383
    15  	maxVarInt4 = 1073741823
    16  	maxVarInt8 = 4611686018427387903
    17  )
    18  
    19  func Append(b []byte, i uint64) []byte {
    20  	if i <= maxVarInt1 {
    21  		return append(b, uint8(i))
    22  	}
    23  	if i <= maxVarInt2 {
    24  		return append(b, []byte{uint8(i>>8) | 0x40, uint8(i)}...)
    25  	}
    26  	if i <= maxVarInt4 {
    27  		return append(b, []byte{uint8(i>>24) | 0x80, uint8(i >> 16), uint8(i >> 8), uint8(i)}...)
    28  	}
    29  	if i <= maxVarInt8 {
    30  		return append(b, []byte{
    31  			uint8(i>>56) | 0xc0, uint8(i >> 48), uint8(i >> 40), uint8(i >> 32),
    32  			uint8(i >> 24), uint8(i >> 16), uint8(i >> 8), uint8(i),
    33  		}...)
    34  	}
    35  	panic(fmt.Sprintf("%#x doesn't fit into 62 bits", i))
    36  }