-
Notifications
You must be signed in to change notification settings - Fork 0
/
wechat_dat_to_jpg.go
113 lines (102 loc) · 2.27 KB
/
wechat_dat_to_jpg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
)
//
func init() {
log.SetFlags(0)
}
func main() {
// 微信 .dat 文件目录
// C:\Users\taadis\Documents\WeChat Files\taadis\FileStorage\Image\2019-07
// 输入目录
dirname, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
log.Panicln(err)
}
// 输出目录
outputDirname := filepath.Join(dirname, "output")
log.Printf("当前程序执行路径: %s", dirname)
fileInfos, err := ioutil.ReadDir(dirname)
if err != nil {
log.Panicln(err)
}
var datFiles []string // dat 文件集合
for key, fileInfo := range fileInfos {
// 判断是目录还是文件
if fileInfo.IsDir() {
log.Println("dir: ", key)
} else {
// 判断是不是 .dat 后缀的文件
if !strings.HasSuffix(fileInfo.Name(), ".dat") {
break
}
inFilename := fmt.Sprintf("%s\\%s", dirname, fileInfo.Name())
datFiles = append(datFiles, inFilename)
}
}
//
if len(datFiles) < 1 {
log.Println("当前路径下没有找到需要处理的 .dat 文件")
return
}
//
for key, datFile := range datFiles {
datBytes, err := ioutil.ReadFile(datFile) //
if err != nil {
log.Println(err)
}
imgBytes, err := WechatDatToImage(datBytes)
if err != nil {
log.Panicln(err)
}
datFilename := filepath.Base(datFile) + ".jpg"
outFilename := filepath.Join(outputDirname, datFilename)
err = ensureDirExist(outFilename)
if err != nil {
log.Panicln(err)
}
err = ioutil.WriteFile(outFilename, imgBytes, 0777)
if err != nil {
log.Panicln(err)
}
log.Printf("compeleted: %d %s", key, outFilename)
}
}
// 微信 dat 字节数组转图片字节数组
func WechatDatToImage(dat []byte) (img []byte, err error) {
var buffer bytes.Buffer
for _, value := range dat {
err = buffer.WriteByte(value ^ 0xF2)
if err != nil {
return
}
}
img = buffer.Bytes()
return
}
// 写个函数,确保文件夹存在,省的重复写
func ensureDirExist(path string) error {
dir := filepath.Dir(path)
exists := isPathExists(dir)
if !exists {
err := os.MkdirAll(dir, os.ModePerm)
if err != nil {
return err
}
}
return nil
}
// 判断路径是否存在
func isPathExists(path string) bool {
if _, err := os.Stat(path); err != nil {
return false
}
return true
}