github.com/whatap/golib@v0.0.22/util/hexa32/Hexa32.go (about) 1 package hexa32 2 3 import ( 4 "math" 5 "strconv" 6 ) 7 8 const PLUS = 'x' 9 const MINUS = 'z' 10 11 func ToString32(num int64) string { 12 minus := num < 0 13 if minus { 14 if num == math.MinInt64 { 15 return "z8000000000000" 16 } 17 return "z" + to_str(-num) 18 } else { 19 if num < 10 { 20 return strconv.Itoa(int(num)) 21 } else { 22 return "x" + to_str(num) 23 } 24 } 25 } 26 func ToLong32(str string) int64 { 27 if str == "" { 28 return 0 29 } 30 switch str[0] { 31 case MINUS: 32 if "z8000000000000" == str { 33 return math.MinInt64 34 } else { 35 return -1 * to_long(str[1:len(str)]) 36 } 37 case PLUS: 38 return to_long(str[1:len(str)]) 39 default: 40 i, err := strconv.Atoi(str) 41 if err != nil { 42 return 0 43 } 44 return int64(i) 45 } 46 47 } 48 49 var digits = []byte{ 50 '0', '1', '2', '3', '4', '5', 51 '6', '7', '8', '9', 'a', 'b', 52 'c', 'd', 'e', 'f', 'g', 'h', 53 'i', 'j', 'k', 'l', 'm', 'n', 54 'o', 'p', 'q', 'r', 's', 't', 55 'u', 'v', 'w', 'x', 'y', 'z'} 56 57 func to_str(i int64) string { 58 radix := int64(32) 59 buf := make([]byte, 65) 60 charPos := 64 61 for i = -i; i <= (-radix); i = i / radix { 62 buf[charPos] = digits[int(-(i % radix))] 63 charPos-- 64 } 65 buf[charPos] = digits[int(-i)] 66 67 return string(buf[charPos:65]) 68 } 69 70 func to_long(s string) int64 { 71 var result int64 = 0 72 var limit int64 = -math.MaxInt64 73 var multmin int64 = limit / 32 74 sz := len(s) 75 76 findc := func(x int) int64 { 77 switch { 78 case '0' <= x && x <= '9': 79 return int64(x - '0') 80 case 'a' <= x && x <= 'z': 81 return int64(x - 'a' + 10) 82 case 'A' <= x && x <= 'Z': 83 return int64(x - 'A' + 10) 84 default: 85 return 0 86 } 87 } 88 89 for i := 0; i < sz; i++ { 90 digit := findc(int(s[i])) 91 if result < multmin { 92 return 0 93 } 94 result *= 32 95 if result < limit+digit { 96 return 0 97 } 98 result -= digit 99 } 100 return -result 101 }