base64.go 1.2 KB

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