snappy.go 764 B

12345678910111213141516171819202122232425262728293031323334353637
  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. var (
  16. pos = uint32(16)
  17. max = uint32(len(src))
  18. dst []byte
  19. )
  20. for pos < max {
  21. size := binary.BigEndian.Uint32(src[pos : pos+4])
  22. pos = pos + 4
  23. chunk, err := snappy.Decode(nil, src[pos:pos+size])
  24. if err != nil {
  25. return nil, err
  26. }
  27. pos = pos + size
  28. dst = append(dst, chunk...)
  29. }
  30. return dst, nil
  31. }
  32. return snappy.Decode(nil, src)
  33. }