...
1 package base64
2
3 import (
4 "bytes"
5 "encoding/base64"
6 "encoding/binary"
7
8 "github.com/pkg/errors"
9 )
10
11 func Encode(src []byte) []byte {
12 enc := base64.RawURLEncoding
13 dst := make([]byte, enc.EncodedLen(len(src)))
14 enc.Encode(dst, src)
15 return dst
16 }
17
18 func EncodeToStringStd(src []byte) string {
19 return base64.StdEncoding.EncodeToString(src)
20 }
21
22 func EncodeToString(src []byte) string {
23 return base64.RawURLEncoding.EncodeToString(src)
24 }
25
26 func EncodeUint64ToString(v uint64) string {
27 data := make([]byte, 8)
28 binary.BigEndian.PutUint64(data, v)
29
30 i := 0
31 for ; i < len(data); i++ {
32 if data[i] != 0x0 {
33 break
34 }
35 }
36
37 return EncodeToString(data[i:])
38 }
39
40 func Decode(src []byte) ([]byte, error) {
41 var enc *base64.Encoding
42
43 var isRaw = !bytes.HasSuffix(src, []byte{'='})
44 var isURL = !bytes.ContainsAny(src, "+/")
45 switch {
46 case isRaw && isURL:
47 enc = base64.RawURLEncoding
48 case isURL:
49 enc = base64.URLEncoding
50 case isRaw:
51 enc = base64.RawStdEncoding
52 default:
53 enc = base64.StdEncoding
54 }
55
56 dst := make([]byte, enc.DecodedLen(len(src)))
57 n, err := enc.Decode(dst, src)
58 if err != nil {
59 return nil, errors.Wrap(err, `failed to decode source`)
60 }
61 return dst[:n], nil
62 }
63
64 func DecodeString(src string) ([]byte, error) {
65 return Decode([]byte(src))
66 }
67
View as plain text