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  }