conv/uint.go (103 lines of code) (raw):
package conv
// UInt8ToBytes is the fastest way to convert uint8 into byte slice
func UInt8ToBytes(n uint8, buf *[3]byte) []byte {
if n == 0 {
return digits1[0]
} else if n < 10 {
return digits1[n]
} else if n < 100 {
return digits2[n]
}
n = n - 100
if n < 100 {
buf[0] = '1'
} else {
n = n - 100
buf[0] = '2'
}
buf[1], buf[2] = digits2[n][0], digits2[n][1]
return buf[0:]
}
// UInt16ToBytes is the fastest way to convert uint16 into byte slice
func UInt16ToBytes(n uint16, buf *[5]byte) []byte {
if n == 0 {
return digits1[0]
}
return ui16Dig(n, buf)
}
// UInt32ToBytes is the fastest way to convert uint32 into byte slice
func UInt32ToBytes(n uint32, buf *[10]byte) []byte {
if n == 0 {
return digits1[0]
}
return ui32Dig(n, buf)
}
// UInt64ToBytes is the fastest way to convert uint64 into byte slice
func UInt64ToBytes(n uint64, buf *[20]byte) []byte {
if n == 0 {
return digits1[0]
}
return ui64Dig(n, buf)
}
func ui16Dig(u uint16, buf *[5]byte) []byte {
if u < 10 {
return digits1[u]
} else if u < 100 {
return digits2[u]
}
pos := 5
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
return buf[pos:]
}
func ui32Dig(u uint32, buf *[10]byte) []byte {
if u < 10 {
return digits1[u]
} else if u < 100 {
return digits2[u]
}
pos := 10
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
return buf[pos:]
}
func ui64Dig(u uint64, buf *[20]byte) []byte {
if u < 10 {
return digits1[u]
} else if u < 100 {
return digits2[u]
}
pos := 20
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
return buf[pos:]
}