Files
multibase/multibase.go

79 lines
2.1 KiB
Go
Raw Normal View History

2016-08-22 17:37:43 -07:00
package multibase
import (
"encoding/hex"
"encoding/base64"
2016-08-22 17:37:43 -07:00
"fmt"
b58 "github.com/jbenet/go-base58"
b32 "github.com/whyrusleeping/base32"
2016-08-22 17:37:43 -07:00
)
const (
Base1 = '1'
Base2 = '0'
Base8 = '7'
Base10 = '9'
Base16 = 'f' // 'F'
Base32 = 'u' // 'U'
Base32hex = 'v' // 'V'
2016-08-22 17:37:43 -07:00
Base58Flickr = 'Z'
Base58BTC = 'z'
Base64 = 'y'
Base64url = 'Y'
2016-08-22 17:37:43 -07:00
)
var ErrUnsupportedEncoding = fmt.Errorf("selected encoding not supported")
func Encode(base int, data []byte) (string, error) {
switch base {
case Base16, 'F':
return string(Base16) + hex.EncodeToString(data), nil
case Base32, 'U':
return string(Base32) + b32.RawStdEncoding.EncodeToString(data), nil
case Base32hex, 'V':
return string(Base32hex) + b32.RawHexEncoding.EncodeToString(data), nil
2016-08-22 17:37:43 -07:00
case Base58BTC:
return string(Base58BTC) + b58.EncodeAlphabet(data, b58.BTCAlphabet), nil
case Base58Flickr:
return string(Base58Flickr) + b58.EncodeAlphabet(data, b58.FlickrAlphabet), nil
case Base64:
return string(Base64) + base64.StdEncoding.EncodeToString(data), nil
case Base64url:
return string(Base64url) + base64.URLEncoding.EncodeToString(data), nil
2016-08-22 17:37:43 -07:00
default:
return "", ErrUnsupportedEncoding
}
}
func Decode(data string) (int, []byte, error) {
2016-10-24 15:31:20 -07:00
if len(data) == 0 {
return 0, nil, fmt.Errorf("cannot decode multibase for zero length string")
}
2016-08-22 17:37:43 -07:00
switch data[0] {
case Base16, 'F':
bytes, err := hex.DecodeString(data[1:])
return Base16, bytes, err
case Base32, 'U':
bytes, err := b32.RawStdEncoding.DecodeString(data[1:])
return Base32, bytes, err
case Base32hex, 'V':
bytes, err := b32.RawHexEncoding.DecodeString(data[1:])
return Base32hex, bytes, err
2016-08-22 17:37:43 -07:00
case Base58BTC:
return Base58BTC, b58.DecodeAlphabet(data[1:], b58.BTCAlphabet), nil
case Base58Flickr:
return Base58Flickr, b58.DecodeAlphabet(data[1:], b58.FlickrAlphabet), nil
case Base64:
bytes, err := base64.StdEncoding.DecodeString(data[1:])
return Base64, bytes, err
case Base64url:
bytes, err := base64.URLEncoding.DecodeString(data[1:])
return Base64url, bytes, err
2016-08-22 17:37:43 -07:00
default:
return -1, nil, ErrUnsupportedEncoding
}
}