github.com/andy2046/gopie@v0.7.0/pkg/base58/base58.go (about) 1 // Package base58 implements Base58 Encoder interface. 2 package base58 3 4 import ( 5 "encoding/binary" 6 "errors" 7 "fmt" 8 ) 9 10 const ( 11 source = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" 12 ln = uint64(58) 13 ) 14 15 var ( 16 encodeMap [58]byte 17 decodeMap [256]int 18 // ErrEmptyString for empty Base58 encoded string. 19 ErrEmptyString = errors.New("base58: empty Base58 encoded string") 20 ) 21 22 func init() { 23 for i := range decodeMap { 24 decodeMap[i] = -1 25 } 26 for i := range source { 27 encodeMap[i] = source[i] 28 decodeMap[encodeMap[i]] = i 29 } 30 } 31 32 // Encode returns Base58 encoded string. 33 func Encode(n uint64) string { 34 if n == 0 { 35 return string(encodeMap[:1]) 36 } 37 38 b, div := make([]byte, 0, binary.MaxVarintLen64), uint64(0) 39 for n > 0 { 40 div = n / ln 41 b = append(b, encodeMap[n-div*ln]) 42 n = div 43 } 44 Reverse(b) 45 return string(b) 46 } 47 48 // Decode returns Base58 decoded unsigned int64. 49 func Decode(s string) (uint64, error) { 50 if s == "" { 51 return 0, ErrEmptyString 52 } 53 54 var ( 55 n uint64 56 c int 57 ) 58 for i := range s { 59 c = decodeMap[s[i]] 60 if c < 0 { 61 return 0, fmt.Errorf("base58: invalid character <%s>", string(s[i])) 62 } 63 n = n*58 + uint64(c) 64 } 65 return n, nil 66 } 67 68 // Reverse your byte slice. 69 func Reverse(b []byte) { 70 for l, r := 0, len(b)-1; l < r; l, r = l+1, r-1 { 71 b[l], b[r] = b[r], b[l] 72 } 73 }