Support Media Message (#9)
This commit is contained in:
60
pkg/util/dat2img/dat2img.go
Normal file
60
pkg/util/dat2img/dat2img.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package dat2img
|
||||
|
||||
// copy from: https://github.com/tujiaw/wechat_dat_to_image
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Format struct {
|
||||
Header []byte
|
||||
Ext string
|
||||
}
|
||||
|
||||
var (
|
||||
JPG = Format{Header: []byte{0xFF, 0xD8, 0xFF}, Ext: "jpg"}
|
||||
PNG = Format{Header: []byte{0x89, 0x50, 0x4E, 0x47}, Ext: "png"}
|
||||
GIF = Format{Header: []byte{0x47, 0x49, 0x46, 0x38}, Ext: "gif"}
|
||||
TIFF = Format{Header: []byte{0x49, 0x49, 0x2A, 0x00}, Ext: "tiff"}
|
||||
BMP = Format{Header: []byte{0x42, 0x4D}, Ext: "bmp"}
|
||||
Formats = []Format{JPG, PNG, GIF, TIFF, BMP}
|
||||
)
|
||||
|
||||
func Dat2Image(data []byte) ([]byte, string, error) {
|
||||
|
||||
if len(data) < 4 {
|
||||
return nil, "", fmt.Errorf("data length is too short: %d", len(data))
|
||||
}
|
||||
|
||||
findFormat := func(data []byte, header []byte) bool {
|
||||
xorBit := data[0] ^ header[0]
|
||||
for i := 0; i < len(header); i++ {
|
||||
if data[i]^header[i] != xorBit {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
var xorBit byte
|
||||
var find bool
|
||||
var ext string
|
||||
for _, format := range Formats {
|
||||
if find = findFormat(data, format.Header); find {
|
||||
xorBit = data[0] ^ format.Header[0]
|
||||
ext = format.Ext
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !find {
|
||||
return nil, "", fmt.Errorf("unknown image type: %x %x", data[0], data[1])
|
||||
}
|
||||
|
||||
out := make([]byte, len(data))
|
||||
for i := range data {
|
||||
out[i] = data[i] ^ xorBit
|
||||
}
|
||||
|
||||
return out, ext, nil
|
||||
}
|
||||
16
pkg/util/lz4/lz4.go
Normal file
16
pkg/util/lz4/lz4.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package lz4
|
||||
|
||||
import (
|
||||
"github.com/pierrec/lz4/v4"
|
||||
)
|
||||
|
||||
func Decompress(src []byte) ([]byte, error) {
|
||||
// FIXME: lz4 的压缩率预计不到 3,这里设置了 4 保险一点
|
||||
out := make([]byte, len(src)*4)
|
||||
|
||||
n, err := lz4.UncompressBlock(src, out)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out[:n], nil
|
||||
}
|
||||
@@ -41,3 +41,7 @@ func IsNumeric(s string) bool {
|
||||
}
|
||||
return len(s) > 0
|
||||
}
|
||||
|
||||
func SplitInt64ToTwoInt32(input int64) (int64, int64) {
|
||||
return input & 0xFFFFFFFF, input >> 32
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user