compress.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. if compressedData[0]&0x01 != 0 {
  32. zr, err := gzip.NewReader(bytes.NewReader(compressedData[1:]))
  33. if err != nil {
  34. log.Println("[UncompressData NewReader ERROR]", err)
  35. return compressedData, false
  36. }
  37. defer zr.Close()
  38. uncompressedData, err := io.ReadAll(zr)
  39. if err != nil {
  40. log.Println("[UncompressData ReadAll ERROR]", err)
  41. return compressedData, false
  42. }
  43. return uncompressedData, true
  44. } else {
  45. return compressedData[1:], true
  46. }
  47. }