ROT13-Algorithmus

Thisor

Bekanntes Mitglied
Hallo,
Beim ROT13-Algorithmus wird jeder Buchstabe um 13 Stellen im Alphabet nach vorn oder hinten geschoben. In Java bedeuted dies, man muss zu einen char 13 addieren oder subtrahieren. Sonderzeichen lasse ich unverändert.
Beispiele:
rot13("Hallo") -> "Unyyb"
rot13("Unyyb") -> "Hallo"

Mein Code lautet bisher :
Java:
char [] neu = new char[100];
       

        for (int i = 0; i < text.length; i++) {
            char c = (char)text[i];

            if (c >= 'a' && c <= 'm')
                c += 13;
            else if (c >= 'A' && c <= 'M')
                c += +13;
            else if (c >= 'n' && c <= 'z')
                c -= 13;
            else if (c >= 'N' && c <= 'Z')
                c -= 13;
            
            neu = c;
        }
        return neu;

    }
}

ich kann c aber nicht zu neu zuweißen, da "cannot convert from c to [] c
 

Daimond

Mitglied
Du willst in der Vorletzten zeile deinem Array einen wert zuweisten von einer nicht Array Variable. Du musst beim Array ein Index angeben.(neu[i] = c)
 
Zuletzt bearbeitet von einem Moderator:

Daimond

Mitglied
Aus irgendein Grund hat das forum ein Teil meiner Antwort nicht genommen und ich kanns auch nicht bearbeiten. Es sollte (neu[i] = c) heißen.

Edit: Klappt auch im neuen Post nicht
neu "eckeigeklammerauf" i "eckeigeklammerzu" = c
 
Zuletzt bearbeitet von einem Moderator:

Thisor

Bekanntes Mitglied
@Daimond
Ich denke schon, allerdings komme ich nicht zurecht wo ich das einfügen soll.
Es muss noch in die For-Schleife kommen aber wohl doch nicht nach jeder if-anweißung, oder?
Ich meine es vorhin dennoch ausprobiert zu haben aber die JUnit Test´s waren dann nicht richtig.

Mal was anderes:
Kann ich das Array noch anders belegen als :
char [] neu = new char[100]; ?

Edit:
Ich hab jetzt nochmal in jedem if-statement
neu = c; eingefügt. Wenn ich es durchlaufen lasse kommen wie erwähnt die Fehler. Doch wenn man sich das mal anschaut kommt:

org.junit.ComparisonFailure: expected:<Unyyb[]> but was:<Unyyb[

also fehlt mir die zweite eckige klammer..? o_O

lg
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Ja, dein Array solltest du mit:

Code:
char [] neu = new char[text.length];

anlegen. Und du musstest doch nur aus
Code:
neu = c;
ein
Code:
neu[i] = c;
machen.
 

Thisor

Bekanntes Mitglied
Ja, dein Array solltest du mit:

Code:
char [] neu = new char[text.length];

anlegen. Und du musstest doch nur aus
Code:
neu = c;
ein
Code:
neu[i] = c;
machen.

jap, allerdings hab ich :

Java:
public static char[] rot13(char[] text) {

        char[] neu = text;
        // neu = ;
        for (int i = 0; i < text.length; i++) {

            char c = text[i];

            if (c >= 'a' && c <= 'm') {
                c += 13;
                neu[i] = c;

            } else if (c >= 'A' && c <= 'M') {
                c += +13;
                neu[i] = c;

            } else if (c >= 'n' && c <= 'z') {
                c -= 13;
                neu[i] = c;

            } else if (c >= 'N' && c <= 'Z')
                c -= 13;
            neu[i] = c;
        }

        return neu;

    }
}

so funktioniert das auch :)
wieso würde
Code:
char [] neu = new char[text.length];
funktionieren? text.length ist ja ein int wert, caste ich das in der Zeile?
 

JStein52

Top Contributor
Ja so funktioniert das auch. Aber damit zeigt neu auf text, d.h. du legst kein neues array an ! Ist in dem Fall vermutlich nicht schlimm weil du den Originaltext nicht mehr brauchst.
Und wieso denkst du dass du in besagter Zeile irgendwas castest ? Wie du doch selber sagst: text.length ist int-Wert und als Länge des Arrays brauchst du doch einen int-Wert. Du hattest doch vorher auch 100 dort stehen !! 100 ist auch int
 

Thisor

Bekanntes Mitglied
Oh, ja stimmt..ich weiß nicht was mir durch den Kopf ging :p
Mit [100] belegte ich ja 100 Speicher und mit text.length eben exakt die Anzahl der Elemente die vorkommen. Dass beides int-Werte sind, ist mir klar, allerdings dachte ich, dass die länge eines arrays nicht dasselbe ist wie wenn ich nur zb 100 schreibe. Dabei ist es dasselbe
 

tommysenf

Top Contributor
Anbei wollte ich dir noch den Hinweis geben, dass du den Algorithmus nicht für sicherheitskritische Sachen anwenden solltest.
ROT13 gilt seit geraumer Zeit als unsicher und überholt. Hier solltest du lieber den ROT26 Algorithmus verwenden, welcher bedingt durch die doppelte Verschiebelänge logischerweise auch doppelt so viel Sicherheit bietet.

SCNR
 

JStein52

Top Contributor
@tommysenf : ist das so ? Wieso bietet der ROT26 doppelt soviel Sicherheit ? Das leuchtet mir noch nicht ein. Ob ich um 13 oder 26 verschiebe ist doch ziemlich egal ?? Oder nicht ?
 

JStein52

Top Contributor
Ja eben. So weit hatte ich auch schon gedacht. Aber er verschiebt ja in der ASCII-Tabelle da ist das ja nicht so. 'a' + 26 = ??? (jedenfalls nicht 'a') :):) also doch dopplet so sicher
 

JStein52

Top Contributor
:):):) ok. Danke. Wobei aber ROT26 nicht einfach eine Verschiebung um 26 ist sondern ein doppelter ROT13 !! Das ist ein kleiner Unterschied und erklärt die Aussage doppelt so sicher ! Wobei das mit dem sicher ja wohl eher relativ ist. Es ist halt so sicher dass ein normaler Mensch 5 Minuten braucht um drauf zu kommen statt 1 Minute.
 

Neue Themen


Oben