gcompress_zlib.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
  2. //
  3. // This Source Code Form is subject to the terms of the MIT License.
  4. // If a copy of the MIT was not distributed with this file,
  5. // You can obtain one at https://github.com/gogf/gf.
  6. // Package gcompress provides kinds of compression algorithms for binary/bytes data.
  7. package gcompress
  8. import (
  9. "bytes"
  10. "compress/zlib"
  11. "io"
  12. "github.com/gogf/gf/v2/errors/gerror"
  13. )
  14. // Zlib compresses `data` with zlib algorithm.
  15. func Zlib(data []byte) ([]byte, error) {
  16. if data == nil || len(data) < 13 {
  17. return data, nil
  18. }
  19. var (
  20. err error
  21. in bytes.Buffer
  22. writer = zlib.NewWriter(&in)
  23. )
  24. if _, err = writer.Write(data); err != nil {
  25. err = gerror.Wrapf(err, `zlib.Writer.Write failed`)
  26. return nil, err
  27. }
  28. if err = writer.Close(); err != nil {
  29. err = gerror.Wrapf(err, `zlib.Writer.Close failed`)
  30. return in.Bytes(), err
  31. }
  32. return in.Bytes(), nil
  33. }
  34. // UnZlib decompresses `data` with zlib algorithm.
  35. func UnZlib(data []byte) ([]byte, error) {
  36. if data == nil || len(data) < 13 {
  37. return data, nil
  38. }
  39. var (
  40. out bytes.Buffer
  41. bytesReader = bytes.NewReader(data)
  42. zlibReader, err = zlib.NewReader(bytesReader)
  43. )
  44. if err != nil {
  45. err = gerror.Wrapf(err, `zlib.NewReader failed`)
  46. return nil, err
  47. }
  48. if _, err = io.Copy(&out, zlibReader); err != nil {
  49. err = gerror.Wrapf(err, `io.Copy failed`)
  50. return nil, err
  51. }
  52. return out.Bytes(), nil
  53. }