snappy.go 772 B

123456789101112131415161718192021222324252627282930313233343536
  1. package sarama
  2. import (
  3. "bytes"
  4. "code.google.com/p/snappy-go/snappy"
  5. "encoding/binary"
  6. _ "fmt"
  7. )
  8. var snappyMagic = []byte{130, 83, 78, 65, 80, 80, 89, 0}
  9. // SnappyEncode encodes binary data
  10. func SnappyEncode(src []byte) ([]byte, error) {
  11. return snappy.Encode(nil, src)
  12. }
  13. // SnappyDecode decodes snappy data
  14. func SnappyDecode(src []byte) ([]byte, error) {
  15. if bytes.Equal(src[:8], snappyMagic) {
  16. pos := uint32(16)
  17. max := uint32(len(src))
  18. dst := make([]byte, 0)
  19. for pos < max {
  20. size := binary.BigEndian.Uint32(src[pos : pos+4])
  21. pos = pos + 4
  22. chunk, err := snappy.Decode(nil, src[pos:pos+size])
  23. if err != nil {
  24. return nil, err
  25. }
  26. pos = pos + size
  27. dst = append(dst, chunk...)
  28. }
  29. return dst, nil
  30. }
  31. return snappy.Decode(nil, src)
  32. }