You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
870 B
43 lines
870 B
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 |
|
}
|
|
|