snappy.go 763 B

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