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
|
||||
}
|
||||
Reference in New Issue
Block a user