Diese Klasse verpackt einen kompletten Ordner in eine einzige verschlüsselte Datei (Archiv, Binärdatei). Solche Binärdateien sieht man bspw. oft bei Games, die ihre Dateien natürlich schützen wollen. Die Verschlüsselung kann in der Methode create() angepasst werden, vorgegeben ist eine simple XOR-Verschlüsselung. Die vorgegebene Struktur sieht wie folgt aus:
|
Quellcode
|
1
2
3
4
5
6
|
für jede Datei {
Unsigned Short: Länge vom Dateipfad
String (ISO-LATIN-1): Dateipfad
Integer: Dateigröße
Byte-Array: Content
}
|
Benötigt wird die von mir schon veröffentlichte PacketWriter-Klasse. Die PacketReader-Klasse kann später für eine BinaryFileReader-Klasse verwendet werden, möglicherweise stell ich diese auch noch zur Verfügung.
BinaryFileCreator.java
|
Quellcode
|
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
|
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import tools.PacketWriter;
/**
*
* @author Flav
*/
public class BinaryFileCreator {
private static BinaryFileCreator instance;
private static String output;
private PacketWriter writer;
static {
instance = new BinaryFileCreator();
}
public BinaryFileCreator() {
writer = new PacketWriter();
}
private void addFile(File file) {
if (file.isDirectory()) {
String[] files = file.list();
for (int i = 0; i < files.length; i++) {
addFile(new File(String.format("%s\\%s", file.getPath(), files[i])));
}
} else {
String name = file.getPath().replace("\", "/");
name = name.substring(name.indexOf("/") + 1);
System.out.println(name);
writer.writeString(name);
ByteArrayOutputStream out = new ByteArrayOutputStream();
FileInputStream in = null;
try {
in = new FileInputStream(file);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
byte[] data = out.toByteArray();
writer.writeInt(data.length);
writer.writeByteArray(data);
}
}
private void create() {
byte[] arr = writer.toByteArray();
// encrypt the buffer
for (int i = 0; i < arr.length; i++) {
arr[i] ^= 0x40;
}
FileOutputStream out = null;
try {
out = new FileOutputStream(output);
out.write(arr);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
output = args[0];
instance.addFile(new File(args[1]));
instance.create();
}
}
|
Beim Starten ist der erste Parameter der Output, der Zweite der Input.