observer-cmd-utils/utils/number.go

86 lines
1.6 KiB
Go

package utils
import (
"bytes"
"github.com/jxskiss/base62"
fasthex "github.com/tmthrgd/go-hex"
"strconv"
"strings"
)
var encoding = base62.NewEncoding("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
func DecodeBinaryNumber(i string) uint64 {
if n, err := strconv.ParseUint(i, 10, 0); strings.Index(i, ".") == -1 && err == nil {
return n
}
if n, err := encoding.ParseUint([]byte(strings.ReplaceAll(i, ".", ""))); err == nil {
return n
}
return 0
}
func EncodeBinaryNumber(n uint64) string {
v1 := string(encoding.FormatUint(n))
v2 := strconv.FormatUint(n, 10)
if !strings.ContainsAny(v1, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") {
v1 = "." + v1
}
if len(v1) >= len(v2) {
return v2
}
return v1
}
func DecodeHexBinaryNumber(i string) string {
if _, err := fasthex.DecodeString(i); strings.Index(i, ".") == -1 && err == nil {
return i
}
if n, err := encoding.Decode([]byte(strings.ReplaceAll(i, ".", ""))); err == nil {
return fasthex.EncodeToString(n)
}
return ""
}
func EncodeSliceBinaryNumber(dst, src []byte) []byte {
if len(dst) < 1+(len(src)*2) {
return nil
}
v := encoding.EncodeToBuf(dst[:0], src)
if !bytes.ContainsAny(v, "GHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz") {
copy(dst[1:], v)
dst[0] = '.'
v = dst[:len(v)]
}
if len(v) >= (len(src) * 2) {
fasthex.Encode(dst, src)
return dst[:len(src)*2]
}
return v
}
func EncodeHexBinaryNumber(v2 string) string {
b, _ := fasthex.DecodeString(v2)
v1 := encoding.EncodeToString(b)
if !strings.ContainsAny(v1, "GHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz") {
v1 = "." + v1
}
if len(v1) >= len(v2) {
return v2
}
return v1
}