|
|
@@ -0,0 +1,43 @@
|
|
|
+package snappy
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "encoding/binary"
|
|
|
+
|
|
|
+ master "github.com/golang/snappy"
|
|
|
+)
|
|
|
+
|
|
|
+var xerialHeader = []byte{130, 83, 78, 65, 80, 80, 89, 0}
|
|
|
+
|
|
|
+// Encode encodes data as snappy with no framing header.
|
|
|
+func Encode(src []byte) []byte {
|
|
|
+ return master.Encode(nil, src)
|
|
|
+}
|
|
|
+
|
|
|
+// Decode decodes snappy data whether it is traditional unframed
|
|
|
+// or includes the xerial framing format.
|
|
|
+func Decode(src []byte) ([]byte, error) {
|
|
|
+ if !bytes.Equal(src[:8], xerialHeader) {
|
|
|
+ return master.Decode(nil, src)
|
|
|
+ }
|
|
|
+
|
|
|
+ var (
|
|
|
+ pos = uint32(16)
|
|
|
+ max = uint32(len(src))
|
|
|
+ dst = make([]byte, 0, len(src))
|
|
|
+ chunk []byte
|
|
|
+ err error
|
|
|
+ )
|
|
|
+ for pos < max {
|
|
|
+ size := binary.BigEndian.Uint32(src[pos : pos+4])
|
|
|
+ pos += 4
|
|
|
+
|
|
|
+ chunk, err = master.Decode(chunk, src[pos:pos+size])
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ pos += size
|
|
|
+ dst = append(dst, chunk...)
|
|
|
+ }
|
|
|
+ return dst, nil
|
|
|
+}
|