Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Banana-Coding.com - Java Knuddels Emulator. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Mittwoch, 5. September 2012, 07:09

BinaryFileCreator

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.
Tschüß.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Flav« (7. September 2012, 15:53)


2

Freitag, 7. September 2012, 15:56

Hier die dazu gehörende Reader-Klasse.

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
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import tools.PacketReader;

/**
 *
 * @author Flav
 */
public class BinaryFileReader {
	private static BinaryFileReader instance;

	private HashMap<String, byte[]> files;

	static {
		instance = new BinaryFileReader();
	}

	public BinaryFileReader() {
		files = new HashMap<String, byte[]>();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		FileInputStream in = null;

		try {
			in = new FileInputStream("Data.dat");
			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[] arr = out.toByteArray();

		for (int i = 0; i < arr.length; i++) {
			arr[i] ^= 0x40;
		}

		PacketReader reader = new PacketReader(arr);

		while (reader.remaining() > 0) {
			files.put(reader.readString(), reader.readByteArray(reader.readInt()));
		}
	}

	public static BinaryFileReader get() {
		return instance;
	}

	public ByteArrayInputStream getFile(String name) {
		byte[] data = files.get(name);

		if (data == null) {
			return null;
		}

		return new ByteArrayInputStream(data);
	}
}
Tschüß.