java解析dat_Java批量解析dat⽂件
代码
以下是java代码,创建⼀个weChatImgRevert .java后复制进去就好啦。
此处的jdk版本需要1.8以上…,另外三个参数需要改成⾃⼰的哦~
package ample.demo;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import urrent.atomic.AtomicReference;
public class weChatImgRevert {
public static void main(String[] args) {
String path = "C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage\\Image\\2019-07"; String targetPath = "D:\\weChat\\2019-07\\";
int xor = 0xCB;
convert(path, targetPath, xor);
}
/**
* @param path 图⽚地址
* @param targetPath 转换后⽬录
*/
private static void convert(String path, String targetPath, int xor) {
File[] file = new File(path).listFiles();
if (file == null) {
return;
}
int size = file.length;
System.out.println("总共" + size + "个⽂件");
AtomicReference integer = new AtomicReference<>(0);
Arrays.stream(file).parallel().forEach(file1 -> {
try (InputStream reader = new FileInputStream(file1);
OutputStream writer =
new FileOutputStream(targetPath + Name().split("\\.")[0] + ".jpg")) {
byte[] bytes = new byte[1024 * 10];
int b;
while ((b = ad(bytes)) != -1) {//这⾥的in.read(bytes);就是把输⼊流中的东西,写⼊到内存中(bytes)。
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (int) (bytes[i] ^ xor);
if (i == (b - 1)) {
break;
}
}
writer.write(bytes, 0, b);
writer.flush();
}
integer.() + 1);
System.out.Name() + "(⼤⼩:" + ((double) file1.length() / 1000) + "kb),进度:" + () + "/" + size);
} catch (Exception e) {
e.printStackTrace();
}
});
System.out.println("解析完毕!");
}
/**
* 获取异或值,不⼀定准确,当解析不出来的时候,换⼀张图⽚的异或值来解析
*
* @param PhotoPath
* @return
*/
private static int getXor(String PhotoPath) {
File file = new File(PhotoPath);
try (InputStream reader = new FileInputStream(file)) {
int[] xors = new int[4];
xors[0] = ad() & 0xFF ^ 0xFF;
xors[1] = ad() & 0xFF ^ 0xD8;
reader.skip(file.length() - 1);
xors[2] = ad() & 0xFF ^ 0xFF;
xors[3] = ad() & 0xFF ^ 0xD9;
Map map = new HashMap<>();
for (int xor : xors) {
if (ainsKey(xor)) {
map.put(xor, (xor) + 1);
} else {
map.put(xor, 1);
}
}
return map.values().stream().max(Integer::compareTo).get();
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
代码转换第⼆种⽅式,适合不懂怎么计算,想直接⽤的代码
以下是java代码,创建⼀个WxChatImgRevert.java后复制进去就好啦。
此处的jdk版本需要1.8以上…,另外两个参数需要改成⾃⼰的哦~
package ample.demo;
import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import urrent.atomic.AtomicInteger;
import urrent.atomic.AtomicReference;
public class WxChatImgRevert2 {
public static void main(String[] args) {
String path = "C:\\Users\\Administrator\\Documents\\WeChat Files\\xxx\\FileStorage"; String targetPath = "D:\\weChat\\temp";
convert(path, targetPath);
}
/**
* @param path 图⽚⽬录地址
* @param targetPath 转换后⽬录
*/
private static void convert(String path, String targetPath) {
File[] file = new File(path).listFiles();
if (file == null) {
return;
}
int size = file.length;
System.out.println("总共" + size + "个⽂件");
AtomicReference integer = new AtomicReference<>(0);
AtomicInteger x = new AtomicInteger();
for (File file1 : file) {
if (file1.isFile()) {
Object[] xori = getXor(file1);
if (xori != null && xori[1] != null){
x.set((int)xori[1]);
}
break;
}
}
Arrays.stream(file).parallel().forEach(file1 -> {
if (file1.isDirectory()) {
String[] newTargetPath = Path().split("/|\\\\");
File targetFile = new File(targetPath+File.separator+newTargetPath[newTargetPath.length - 1]); if (!ists()) {
targetFile.mkdirs();
}
Path(),targetPath+File.separator+newTargetPath[newTargetPath.length - 1]); return;
}
Object[] xor = getXor(file1);
if (x.get() == 0 && xor[1] != null && (int) xor[1] != 0) {
x.set((int) xor[1]);
}
xor[1] = xor[1] == null ? x.get() : xor[1];
try (InputStream reader = new FileInputStream(file1);
OutputStream writer =
new FileOutputStream(targetPath + File.separator + Name().split("\\.")[0] + (xor[0] != null ? "." + xor[0] : ""))) {
byte[] bytes = new byte[1024 * 10];
int b;
while ((b = ad(bytes)) != -1) {//这⾥的in.read(bytes);就是把输⼊流中的东西,写⼊到内存中(bytes)。
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) (int) (bytes[i] ^ (int) xor[1]);
if (i == (b - 1)) {
break;
}
}
writer.write(bytes, 0, b);
writer.flush();
}
integer.() + 1);
System.out.Name() + "(⼤⼩:" + ((double) file1.length() / 1000) + "kb,异或值:" + xor[1] + ")," + "进度:" + () +
"/" + size);
} catch (Exception e) {
e.printStackTrace();
}
});
System.out.println("解析完毕!");
}
/**
* 判断图⽚异或值
*
* @param file
* @return
*/
private static Object[] getXor(File file) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论