compress.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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, err error) {
  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, err
  16. }
  17. if err := zw.Close(); err != nil {
  18. log.Println("[CompressData Close ERROR]", err)
  19. return data, false, err
  20. }
  21. compressedData := buf.Bytes()
  22. if len(compressedData) >= len(data) {
  23. return data, false, nil
  24. } else {
  25. return compressedData, true, nil
  26. }
  27. }
  28. // 解压缩,
  29. func UncompressData(compressedData []byte) (data []byte, ok bool, err error) {
  30. if compressedData[0]&0x01 != 0 {
  31. zr, err := gzip.NewReader(bytes.NewReader(compressedData[1:]))
  32. if err != nil {
  33. log.Println("[UncompressData NewReader ERROR]", err)
  34. return compressedData, false, err
  35. }
  36. defer zr.Close()
  37. uncompressedData, err := io.ReadAll(zr)
  38. if err != nil {
  39. log.Println("[UncompressData ReadAll ERROR]", err)
  40. return compressedData, false, err
  41. }
  42. return uncompressedData, true, nil
  43. } else {
  44. return compressedData[1:], false, nil
  45. }
  46. }