# Datei Ordner in Binär-Zahlenkette umwandeln



## Thor_der_Gott (30. Sep 2013)

Hallo zusammen,

ich habe ein Problem, dass mir bis jetzt weder das Internet noch Fachbücher beantworten konnten :rtfm:

Ich will einen beliebigen Dateiordner inklusive Inhalt in eine Binäre-Zeichenkette verwandeln.

Theoretisch sollte dies doch möglich sein, da der Ordner für den PC auch nur 1 und 0 sind.

Könnt ihr mir weiterhelfen? ???:L

Mit freundlichen Grüßen und schonmal danke für die Hilfe


----------



## anti-held (30. Sep 2013)

Theoretisch ist es natürlich möglich,

aber was willst du denn damit anstellen?


----------



## Thor_der_Gott (30. Sep 2013)

Also...

das ganze klingt jetzt sicher einbisschen ... nennen wir es unnötlig und lächerlich aber ich finde es interessant und nützlich 

Ich will ein Tool schreiben, dass jeden gewüschten Ordner verschlüsselt, hierzu würde ich eine Cäsarchiefre erweitern mit u.a. dem Vorteil, dass man nicht auf 26 Zeichen beschränkt ist. Zudem will ich noch ne Hash-Verschlüsselung drauf werfen, dass die Binäre-Zahlenkette des Ordners als ASCII-Zeichen interpretiert, welche mit 7 Bit nicht linear zu den normal 8 Bit verlaufen und ich somit alles durcheinander werfe.

Meiner Ansicht nach sollte dass dann obwohl beide Verfahren alleine sehr leicht zu knacken sind doch relativ sicher werden.

ich hoffe ich habe dich jetzt nicht erschlagen, erschreckt oder mich als komplett wahnsinnig dargestellt.

Mit freundlichen Grüßen


----------



## anti-held (30. Sep 2013)

Möglich wäre es.
Ich denke es wird sicher eine gute Übung sein, aber ob es wirklich sicher sein wird ist die Frage...

Du müsstest dir überlegen, wie denn dein Byte-Strom aufgebaut sein soll.

Bsp:

-Ordner1
  -File11
  -Ordner11
    -File111
-Ordner2
  -File21

ByteStrom

<String: Ordner1.name><Anfangssymbol für Ordnerinhalt><String: File11.name><Anfangssymbol für Fileinhalt><Byte[]: File11.bytes><Endesymbol für Fileinhalt><String: Ordner11.name><Anfangssymbol für Ordnerinhalt><...

Die Strings natürlich auch mit [c]getBytes()[/c] in ein Byte[] umwandeln.

Ansatz klar?


----------



## Thor_der_Gott (30. Sep 2013)

Hey,

ja der Ansatz ist klar (denke ich) ... hab mir zwar darüber noch keine Gedanken gamacht aber ist zugegeben sehr sinnvoll.

Ich nehme an du schlägst vor bei den Bytes ein Array zu verwenden, da so die Ordnerstruktur einfacher abgebildet werden kann oder? Wenn nicht bin ich mit meiner bisherigen abrbeit wohl etwas auf den Holzweg.

Zwischenzeitlich werden ich mich wohl mal auf die Ver- und Entschlüsselung konzentrieren und mich dann an den Byte-Storm machen, habe mir erhoft es gäbe einen einfachen weg den kompletten Ordnerinhalt als eine einzige Zeichenkette am Stück auslesen. Im Nachhinein gebe ich zu war der Ansatz zwar wünschenswert aber nicht realisierbar.

Vielen Dank für deine Hilfe :toll:


----------



## DrZoidberg (30. Sep 2013)

Also ich würde das so machen.


```
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zout = new ZipOutputStream(baos);
File dir = new File("ordner");
for(File file: dir.listFiles()) {
    byte[] bytes = Files.readAllBytes(file.toPath());
    zout.putNextEntry(new ZipEntry(file.getName()));
    zout.write(bytes);
}
zout.close();
byte[] byteArray = baos.toByteArray();
```


----------



## Thor_der_Gott (1. Okt 2013)

Verstehe ich das richtig, dass du, DrZoidberg, daraus mit dem Codeschnipsel n zip machen würderst.

Wenn ja, bin ich fasziniert wie einfach das geht =D

Ein Zip ist eine gute möglickeit für den anfang 

Ich denke bis zum Wochenende habe ich meinen ersten Prototypen fertig.

Aktuell kann ich (erfolgreich) Texte verschlüsseln ... die Entschlüsselung habe ich auf heute verschoben. 

Mit eurer Hilfe habe ich durchaus sehr hilfreiche Ansätze bekommen nochmals danke, ich lasse den Eintrag noch offen, falls sich noch fragen ergeben aber ich denke fast er ist gelößt.
:idea:
:applaus::toll::applaus:


----------



## Thor_der_Gott (1. Okt 2013)

Hallo,

ich hab die Verschlüsselung jetzt hin bekommen, nur leider klappt das mit dem Zip nicht ... hab mal etwas anderes ausprobiert, da ich mit deinem nicht ganz zurecht gekommen bin.

Könnt ihr mir nochmal kurz weiterhelfen ? Ich bekomme da nur nen Leeren Zip-Ordner raus (in dem definitiv was drin ist, da er in einem meiner Tests mehr als 2Gb groß geworden ist)

Einmal die Mail-Klasse und darunter dann die Funktion


```
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


public class FinalMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File directory = new File("C:/Users/54321/Desktop/Ordner/");
        ZipFile.zip(directory);
	}
	
}
```

Und hier besagte Funktion

```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 
public class ZipFile {
 
    public static boolean zip(File directory) {
        
        boolean result = false;
        
        byte[] buffer = new byte[8192];
        
            try {
                
                LinkedList<String> fileList = getAllFiles(directory);
                
                String outFilename = "C:/Users/54321/Desktop/outfile.zip";
                FileOutputStream fos = new FileOutputStream(outFilename);
                ZipOutputStream zos = new ZipOutputStream(fos);
                
                for (String fileName : fileList) {
                    
                    FileInputStream fis = new FileInputStream(fileName);
                    zos.putNextEntry(new ZipEntry(fileName));
                    
                    int length;
                    while ((length = fis.read(buffer)) > 0) {
                        zos.write(buffer, 0, length);
                    }
                    
                    zos.closeEntry();
                    fis.close();
                }   
                
                zos.close();
                fos.close();
                
                result = true;
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        return result;
        
    }
    
    
    /**
     * Methode legt alle Datei-Pfade in einer LinkedList ab - mit allen Unterordnern
     * @param files
     * @return
     */
    private static LinkedList<String> getAllFiles(File directory) {
        
        File[] files = directory.listFiles();
        
        LinkedList<String> allFiles = new LinkedList<String>();
        
        for (File file : files) {
            
            if (file.isDirectory()) {
                LinkedList<String> moreFiles = getAllFiles(file);
                Iterator<String> iterMoreFiles = moreFiles.iterator();
                while(iterMoreFiles.hasNext()) {
                    allFiles.add(iterMoreFiles.next());
                }
                
            } else {
                allFiles.add(file.getAbsolutePath());
            }   
        }
        
        return allFiles;
    }
}
```


----------



## DrZoidberg (2. Okt 2013)

Thor_der_Gott hat gesagt.:


> ```
> allFiles.add(file.getAbsolutePath());
> ```



Zip Archive kennen keine Laufwerksbuchstaben. Die Pfadangaben müssen relativ sein.
Ausserdem würde ich eine Liste von File Objekten zurückgeben und nicht Strings. Damit reduzierst du das Risiko von Problemen durch Sonderzeichen im Dateinamen.


----------



## Thor_der_Gott (2. Okt 2013)

Also Danke schon euch beiden,

Ich hab jetzt die Verschlüsselung und das Zip,

Wie bekomme ich jetzt aus dem Zip ein String? Ich hab es auf verschiedensten Wegen versucht, aber ich bekomme immer nur den Dateipfad ... und als String kann ich es nicht Casten.

habt ihr ne Idee

(Sorry dass ich euch so nerve ist mir selbst fast peinlich)

Vielen Dank


----------



## DrZoidberg (2. Okt 2013)

Du willst die Zip Datei in einen String umwandeln? Wie genau meinst du das? Alle Bytes der Datei einlesen und jedes in ein char umwandeln? Dann würde ich aber mir einem char Array arbeiten und nicht String.


----------



## Thor_der_Gott (4. Okt 2013)

ja genau, ich will jedes Zeichen auslesen, mir ist eigentlich eagl, wie genau, ich hab mein Tool bis jetzt auf einem String aufgebaut, aber das ist mir um ehrlich zu sein herzlich egal.

Ziel ist es am ende ein Zip einzulesen, die Zeichen anhand der Verschlüsselung zu substituieren. 

Ich Versuche es übers Wochenende und melde mich dann am Montag wieder, da ich zwischendrin etwas vom Internet abgeschnitten 

bis dann und (ich weiß ich wiederhole mich aber ich finde ist immer angebrauch) vielen Dank


----------

