31 lines
716 B
Go
31 lines
716 B
Go
package internal
|
|
|
|
import "fmt"
|
|
|
|
// Uint40 is a 40-bit unsigned integer stored in 5 bytes with little-endian encoding.
|
|
type Uint40 [5]byte
|
|
|
|
// NewUint40 creates a new Uint40 from a uint64.
|
|
func NewUint40(v uint64) Uint40 {
|
|
if v>>40 != 0 {
|
|
panic(fmt.Sprintf("value %d overflows Uint40", v))
|
|
}
|
|
var u Uint40
|
|
u[0] = byte(v)
|
|
u[1] = byte(v >> 8)
|
|
u[2] = byte(v >> 16)
|
|
u[3] = byte(v >> 24)
|
|
u[4] = byte(v >> 32)
|
|
return u
|
|
}
|
|
|
|
// ToUint64 converts the Uint40 to a uint64.
|
|
func (u Uint40) ToUint64() uint64 {
|
|
return uint64(u[0]) | uint64(u[1])<<8 | uint64(u[2])<<16 | uint64(u[3])<<24 | uint64(u[4])<<32
|
|
}
|
|
|
|
// String implements fmt.Stringer.
|
|
func (u Uint40) String() string {
|
|
return fmt.Sprintf("%d", u.ToUint64())
|
|
}
|