compress.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package util
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "io"
  6. "log"
  7. )
  8. // 压缩数据
  9. // 注意:如果没有启用压缩,和数据为空不要调用该函数
  10. func CompressData(data []byte) (out []byte, ok bool) {
  11. var buf bytes.Buffer
  12. zw := gzip.NewWriter(&buf)
  13. if _, err := zw.Write(data); err != nil {
  14. log.Println("[CompressData Write ERROR]", err)
  15. return data, false
  16. }
  17. if err := zw.Close(); err != nil {
  18. log.Println("[CompressData Close ERROR]", err)
  19. return data, false
  20. }
  21. compressedData := buf.Bytes()
  22. if len(compressedData) >= len(data) {
  23. // log.Println("user origin data:", string(data))
  24. return data, false
  25. } else {
  26. return compressedData, true
  27. }
  28. }
  29. // 解压缩
  30. func UncompressData(compressedData []byte) (data []byte, ok bool) {
  31. // 没有压缩,直接返回
  32. if compressedData[0]&0x01 != 0 {
  33. zr, err := gzip.NewReader(bytes.NewReader(compressedData[1:]))
  34. if err != nil {
  35. log.Println("[UncompressData NewReader ERROR]", err)
  36. return compressedData, false
  37. }
  38. defer zr.Close()
  39. uncompressedData, err := io.ReadAll(zr)
  40. if err != nil {
  41. log.Println("[UncompressData ReadAll ERROR]", err)
  42. return compressedData, false
  43. }
  44. return uncompressedData, true
  45. } else {
  46. return compressedData[1:], true
  47. }
  48. }