Problem mit Stringumwandlung

Netzsteckdose

Grünschnabel
Hallo zusammen,
ich moechte einen String verschluesseln und aus meinen Programm in eine Datei speichern und andermal wieder laden und entschluesseln. Ich kann Strings verschluesseln und endschluesseln und Strings speichern und laden, jedoch nicht die Kombination daraus, da macht es irgendwelchen Mist und ich weiss nicht warum. Bei der Verschluesselung wird jeder Buchstabe um einen bestimmten Betrag verschoben. Ich glaube wenn dieser gross genug wird,so dass das Zeichen ueber 255 hinaus geht gibts mit Datei lesen/schreiben fehler und ohne nicht (hab natuerlich mod 256 gemacht).

so les ich die Datei ein:
Code:
FileReader fr = new FileReader(file);
			int size = (int) file.length();
			char[] buffer = new char[size];
			fr.read(buffer, 0, size);
			fr.close();
			String text = encode(new String(buffer));

so schreib ich sie
Code:
			FileWriter fw = new FileWriter(file);
			fw.write(decode(text));
			fw.close();

verschluesselung (*V* ist verschiebung) , entschluesselnung ist analog nur halt andere Richtung
Code:
for (int i = 0; i + 1 < len; i++) {
	for (int j = i + 1; j < len; j++) {
                ich=(int)(test.charAt(j));
                char ch=(char) (( ich+*V*) % 256);
                test = test.substring(0, j)+ ch + test.substring(j + 1, len);
       }
}
wenn also zB V=1 wird aus 12345 -> 13579


wenn ich nun:
Code:
text="Dies ist ein Test-Text";
write();
read();
mache, erhalte ich als gelesenen entschluesselten Text:
Dies ist ein Te0/-Te+*
mit Djgv$ny{(nsy,as>fx als Verschluesselung


mit
Code:
text="Dies ist ein Test-Text";
decode();
encode();
jedoch
Dies ist ein Test-Text
mit Djgv$ny{(nsy,as>fx als Verschluesselung

meine Frage ist nun ob er die Zeichen nicht richtig einlesen kann oder ob ich irgendow einen Fehler gemacht habe, hoffe mir kann jm helfen

---------------soo nachdem ich diesen ewig langen Text geschrieben habe is mir aufgefallen, dass das mit dem % 256 nicht stimmt, bei -V muss es
Code:
char ch=(char) ((256+   ( ich-V) % 256)%256);
sein

nun stellts sich mir aber die Frage warum denn dass vorher mit den Strings ging und nacher immer noch nicht mit write und read :confused:


falls jm testen will:
Code:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class deencoder {

	public int len, off;
	

	public static void main(String[] args) {
		
		deencoder deenc = new deencoder();
		//so gehts nicht
		deenc.write();
		deenc.read();
		
		/*/so aber/*/
		
//		 String text="Dies ist ein Test-Text";
//		 text=deenc.decode(text);
//		 System.out.println(text);
//		 text=deenc.encode(text);
//		 System.out.println(text);

	}

	public void read() {
		String test = "";
		File file = new File("data");
		try {
			FileReader fr = new FileReader(file);
			int size = (int) file.length();
			char[] buffer = new char[size];
			fr.read(buffer, 0, size);
			fr.close();
			test = new String(buffer);
		} catch (Exception e) {
			System.out.println("Fehler beim lesen");
		}
		test = encode(test);
		System.out.println(test);
	}

	public void write() {
		String test = "Dies ist ein Test-Text";
		File file = new File("data");
		
		try {
			test = decode(test);
			System.out.println(test);
			FileWriter fw = new FileWriter(file);
			fw.write(test);
			fw.close();
		} catch (Exception e) {
			System.out
					.println("Fehler beim schreiben");
		}
	}

	public String encode(String test) {
		int len = test.length();
		for (int i = len - 1; i + 1 > 0; i--) {
			for (int j = len - 1; j > i; j--) {
				int ich = (int) (test.charAt(j));
				char ch = (char) ((256 + (ich - 1) % 256) % 256);
				test = test.substring(0, j) + ch + test.substring(j + 1, len);
			}
		}
		return test;
	}

	public String decode(String test) {
		int len = test.length();

		for (int i = 0; i + 1 < len; i++) {
			for (int j = i + 1; j < len; j++) {
				int ich = (int) (test.charAt(j));
				char ch = (char) ((ich + 1) % 256);
				test = test.substring(0, j) + ch + test.substring(j + 1, len);
			}
		}
		return test;
	}
}
 
Zuletzt bearbeitet:
Hallo,

an den mods liegt es auf jeden Fall nicht. Du kommst mit normalem Text eigentlich nicht über 255.
Eine Frage hab ich aber mal. Warum hast du 2 for-Schleifen um über den String zu laufen?

MFG

Sascha
 
Hallo,
da ist ein logischer Fehler in der read() und write() Methode:
- Beim read() benutzt du encode(...), du müsstest dort aber decode(...) verwenden (nach dem Einlesen der Datei willst du ja den String entschlüsseln = dekodieren ).
- Beim write() benutzt du decode(...), du müsstest dort aber encode(...) verwenden (vor dem Schreiben der Datei willst du ja den String verschlüsseln = enkodieren ).

Gruß
Tomek
 
Du kommst mit normalem Text eigentlich nicht über 255.
Eine Frage hab ich aber mal. Warum hast du 2 for-Schleifen um über den String zu laufen?
eigentlich soll V variabel sein, muss also öfter auf die Zeichen addieren

@Tomek_FFM
ist ja egal, hebt sich ja gegenseitig auf

habe es mal mit einzelnen Zeichen versucht, dabei sind Lesefehler aufgetreten bei den Zeichen l28-l59, wenn ich also nur die ersten 128 Zeichen benutzte geht es
 
@Tomek
es ist doch egal ob ich zu den Zeichen erst was dazu addiere und dann wieder abziehe oder erst abziehe und dann dazu addiere.
Das es ging liegt daran, dass man zb bei dem s eher zu 128 kommt wenn man addiert, als zu 159 mit subtrahieren, wenn du den Text lang genug machst oder statt +/-1 als Verschiebung +/-30 wählst kommen auch so Fehler

hier mal Veranschaulicht
eigentlich sollte die while schleife ja nicht abbrechen....tut sie aber, zuindest bei % 256, mit % 128 gehts
Code:
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class IOchar {

	public static void main(String[] args) {
		IOchar r = new IOchar();

		char in, out;
		int i = 0;
		

		while (true) {
			in = (char) i;
			r.write(in);
			out = r.read();
			if (in != out)
				break;
			i=(i+1)%256;
		}

		System.out.println(in + " " + out + " " + i);
	}

	public char read() {
		char test=0;
		File file = new File("data");
		try {
			FileReader fr = new FileReader(file);
			int size = (int) file.length();
			char[] buffer = new char[size];
			fr.read(buffer, 0, size);
			fr.close();
			test = buffer[0];
		} catch (Exception e) {
			System.out.println("Fehler beim lesen");
		}
		return test;

	}

	public void write(char test) {

		File file = new File("data");

		try {
			FileWriter fw = new FileWriter(file);
			fw.write(test);
			fw.close();
		} catch (Exception e) {
			System.out.println("Fehler beim schreiben");
		}
		
	}

}
wer schoen, wenn das auch mit dem kompletten Zeichensatz gehen wuerde, sonst kann man keine Umlaute speichern
 
Zuletzt bearbeitet:
Zurück