github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/btcutil/base58/base58.go (about)

     1  // Copyright (c) 2013-2015 The btcsuite developers
     2  // Use of this source code is governed by an ISC
     3  // license that can be found in the LICENSE file.
     4  
     5  package base58
     6  
     7  import (
     8  	"math/big"
     9  )
    10  
    11  //go:generate go run genalphabet.go
    12  
    13  var bigRadix = big.NewInt(58)
    14  var bigZero = big.NewInt(0)
    15  
    16  // Decode decodes a modified base58 string to a byte slice.
    17  func Decode(b string) []byte {
    18  	answer := big.NewInt(0)
    19  	j := big.NewInt(1)
    20  
    21  	scratch := new(big.Int)
    22  	for i := len(b) - 1; i >= 0; i-- {
    23  		tmp := b58[b[i]]
    24  		if tmp == 255 {
    25  			return []byte("")
    26  		}
    27  		scratch.SetInt64(int64(tmp))
    28  		scratch.Mul(j, scratch)
    29  		answer.Add(answer, scratch)
    30  		j.Mul(j, bigRadix)
    31  	}
    32  
    33  	tmpval := answer.Bytes()
    34  
    35  	var numZeros int
    36  	for numZeros = 0; numZeros < len(b); numZeros++ {
    37  		if b[numZeros] != alphabetIdx0 {
    38  			break
    39  		}
    40  	}
    41  	flen := numZeros + len(tmpval)
    42  	val := make([]byte, flen, flen)
    43  	copy(val[numZeros:], tmpval)
    44  
    45  	return val
    46  }
    47  
    48  // Encode encodes a byte slice to a modified base58 string.
    49  func Encode(b []byte) string {
    50  	x := new(big.Int)
    51  	x.SetBytes(b)
    52  
    53  	answer := make([]byte, 0, len(b)*136/100)
    54  	for x.Cmp(bigZero) > 0 {
    55  		mod := new(big.Int)
    56  		x.DivMod(x, bigRadix, mod)
    57  		answer = append(answer, alphabet[mod.Int64()])
    58  	}
    59  
    60  	// leading zero bytes
    61  	for _, i := range b {
    62  		if i != 0 {
    63  			break
    64  		}
    65  		answer = append(answer, alphabetIdx0)
    66  	}
    67  
    68  	// reverse
    69  	alen := len(answer)
    70  	for i := 0; i < alen/2; i++ {
    71  		answer[i], answer[alen-1-i] = answer[alen-1-i], answer[i]
    72  	}
    73  
    74  	return string(answer)
    75  }