79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
|
/*
|
||
|
* Copyright (c) 2013 Conformal Systems LLC.
|
||
|
*/
|
||
|
|
||
|
package btcutil
|
||
|
|
||
|
import (
|
||
|
"math/big"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Alphabet used by BTC
|
||
|
const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
||
|
|
||
|
var bigRadix = big.NewInt(58)
|
||
|
var bigZero = big.NewInt(0)
|
||
|
|
||
|
// Shared function to Base58 decode to a []byte
|
||
|
func Base58Decode(b string) []byte {
|
||
|
answer := big.NewInt(0)
|
||
|
j := big.NewInt(1)
|
||
|
|
||
|
for i := len(b) - 1; i >= 0; i-- {
|
||
|
tmp := strings.IndexAny(alphabet, string(b[i]))
|
||
|
if tmp == -1 {
|
||
|
return []byte("")
|
||
|
}
|
||
|
idx := big.NewInt(int64(tmp))
|
||
|
tmp1 := big.NewInt(0)
|
||
|
tmp1.Mul(j, idx)
|
||
|
|
||
|
answer.Add(answer, tmp1)
|
||
|
j.Mul(j, bigRadix)
|
||
|
}
|
||
|
|
||
|
tmpval := answer.Bytes()
|
||
|
|
||
|
var numZeros int
|
||
|
for numZeros = 0; numZeros < len(b); numZeros++ {
|
||
|
if b[numZeros] != alphabet[0] {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
flen := numZeros + len(tmpval)
|
||
|
val := make([]byte, flen, flen)
|
||
|
copy(val[numZeros:], tmpval)
|
||
|
|
||
|
return val
|
||
|
}
|
||
|
|
||
|
// Shared function to Base58 encode a []byte
|
||
|
func Base58Encode(b []byte) string {
|
||
|
x := new(big.Int)
|
||
|
x.SetBytes(b)
|
||
|
|
||
|
answer := make([]byte, 0)
|
||
|
for x.Cmp(bigZero) > 0 {
|
||
|
mod := new(big.Int)
|
||
|
x.DivMod(x, bigRadix, mod)
|
||
|
answer = append(answer, alphabet[mod.Int64()])
|
||
|
}
|
||
|
|
||
|
// leading zero bytes
|
||
|
for _, i := range b {
|
||
|
if i != 0 {
|
||
|
break
|
||
|
}
|
||
|
answer = append(answer, alphabet[0])
|
||
|
}
|
||
|
|
||
|
// reverse
|
||
|
alen := len(answer)
|
||
|
for i := 0; i < alen/2; i++ {
|
||
|
answer[i], answer[alen-1-i] = answer[alen-1-i], answer[i]
|
||
|
}
|
||
|
|
||
|
return string(answer)
|
||
|
}
|