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  }