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 }