Char cannot be derefenrenced?

Red John

Mitglied
Hallo,

ich bin noch neu in Java, deshalb bitte die Anfängerfehler nicht so übel nehmen...

Ich habe folgendes Problem: In meinem Javacode beschwert sich der Compiler jedes Mal, das "char cannot be dereferenced".

Mein Auftrag ist ein Javaprogramm zu schreiben, welches einen RSA-Schlüssel generiert und dann damit einen eingegebenen Text verschlüsselt. Dazu lasse ich mit Kon.readString() einen String eingeben. Den ich dann in ein Char-Array umwandle.

Zur Aufgabe kann ich sagen, dass sie auf die einfachst mögliche Weise sein muss, d.h. ohne Extraklassen. Nur Anfängercode ;-)

Java:
System.out.println("Bitte geben sie den zu verschlüsselnden Text an!");
    char [] c;
    String t=new String(Kon.readString());
    c=t.toCharArray();
    int m = c[0];
    int zahl5;
    int dd = n;
    System.out.println("Bitte geben sie 'e' an!");
    e = Kon.readInt();
    System.out.println("Bitte geben sie 'n' an!");
    n = Kon.readInt();
    //System.out.println(m);
    double ergebnis;
    int ergebnis1;
    int j;
    
    //System.out.println(ergebnis);
    //zahl5 = ergebnis1 % n;
    //System.out.print(zahl5);
    
    for (j=0;j<c.length;j++) {
      for (i=0;i<=c[i].length;i++) {
        m= c[i];
        ergebnis = Math.pow(m,e);
        ergebnis1 = (int) ergebnis;
        zahl5 = ergebnis1 % n;
        System.out.print(zahl5);    
      } // end of for
    }
    
    
    
  }
}

Regards Red John
 

rme

Top Contributor
Hallo :)

In deiner inneren Schleife steht folgendes:
Code:
 for (i=0;i<=c[i].length;i++) {

c ist ein Char-Array, d.h. es enthält mehrere chars und hat deshalb eine Eigenschaft "length", damit du weißt, wie viele Eintrage enthalten sind. c ist wiederum ein einzelner Eintrag dieses Arrays, also ein einzelner Buchstabe. Dieser hat keine Eigenschaft für die Länge, da es sich ja nicht mehr um ein Array handelt - die Länge eines einzelnen Zeichens ist immer 1.
 

rme

Top Contributor
Das war keine Verbesserung, sondern nur ein Denkanstoß. Ich kann nicht erkennen, warum du zwei verschachtelte Schleifen verwendest, deshalb wusste ich auch nicht, wodurch das c.length zu ersetzen wäre ;) Wenn du genauer beschreiben könntest, was die beiden Schleifen machen sollen - und deinen aktuellen Code nochmal dazu zeigst - könnte man dir glaube ich effektiver helfen :)
 

Red John

Mitglied
Ich glaube ich sollte erstmal herausfinden, wieso ich immer dieses "ArrayIndexOutOfBoundsException" auftaucht.

Java:
import java.lang.Math.*; 
  
public class RSA1{
  
  int prim1,prim2,mod,d,y,i,high,low,e,n,x;  //Deklaration der Variablen
  
  public static void main (String [] arguments){
    int prim1,prim2,mod,d,y,i,high,low,e,n,x;
    boolean truth;
    String text;
    high = 30; // Man gibt die Obergrenze an
    low = 10; // Man gibt die Untergrenze an
    e = (int) (Math.random()*(high - low) + low); 
    
    System.out.println ("Gib eine Primzahl an");  //Aufforderung eine Primzahl anzugeben
    int p = Kon.readInt ();
    System.out.println ("Gib eine weitere Primzahl an");
    int q = Kon.readInt();
    for(x=2;x<p;x++){                       //  x=2 Startwert; x<p Endwert; x++ Schrittweite
      truth = (p%x==0);                    //  prüfen ob es teilbar ist, wenn der Rest 0 ist
      if (truth==true){
      x=p; } 
      if (truth==true) {
        System.out.println("Die Zahl ist keine Primzahl.");
        System.out.println("END");
        System.exit(0);
      }
      else{
        //System.out.println("Die Zahl ist eine Primzahl.");
      }
    }
    //System.out.println("Die Zahl ist eine Primzahl.");
    for(x=2;x<q;x++){                       //  x=2 Startwert; x<p Endwert; x++ Schrittweite
      truth = (q%x==0);                    //  prüfen ob es teilbar ist, wenn der Rest 0 ist
      if (truth==true){
      x=q; } 
      if (truth==true) {
        System.out.println("Die Zahl ist keine Primzahl.");
        System.out.println("ENDE");
        System.exit(0);
      }
      else{
        //System.out.println("Die Zahl ist eine Primzahl.");
      }
    }
    n = p*q;                                                    //Berechnung von N
    int phi = (p-1)*(q-1);                                          //Berechnung von Phi
    System.out.println("Bitte warten sie!");                                        //Ausgabe von Phi
    mod=0;      
    for(d=2;mod!=1;d++){ 
      i=e*d ;                        // Formel für das Produkt von d*e
      mod = i%phi;                    
      if (mod==1) {                                                       //Wenn i mod phi gleich 1 ergibt, werden 'd' und 'e' ausgegeben        
        System.out.println ("Der private Schlüssel ist: " + d);                             //Ausgabe der Schlüssel
        System.out.println ("Der öffentliche Schlüssel ist: (" + e + ";" + n + ")");
      }
    }
    
    System.out.println("Bitte geben sie den zu verschlüsselnden Text an!");
    char [] c;
    String t=new String(Kon.readString());
    c=t.toCharArray();
    int m = c[0];
    int zahl5;
    int dd = n;
    System.out.println("Bitte geben sie 'e' an!");
    e = Kon.readInt();
    System.out.println("Bitte geben sie 'n' an!");
    n = Kon.readInt();
    //System.out.println(m);
    double ergebnis;
    int ergebnis1;
    int j;
    
      for (i=0;i<=c[i];i++) {
        m= c[i];
        ergebnis = Math.pow(m,e);
        ergebnis1 = (int) ergebnis;
        zahl5 = ergebnis1 % n;
        System.out.print(zahl5);    
      } // end of for
    
    
    
    
  }
}
 

rme

Top Contributor
Weil du in Zeile 75 den Schleifenzähler bis einschließlich c laufen lässt. c ist ein ASCII-Zeichen deiner Eingabe - wenn z.B. an der Stelle eine '2' eingegeben wurde, entspricht dies dem Wert 50 (ASCII-Tabelle). Da das Array c aber weit weniger als 50 Einträge hat, gibt es diese Exception. Da sollte vermutlich [c]< c.length[/c] stehen :)
 

Red John

Mitglied
Das habe ich inzwischen selber gefunden und verbessert. Den Dateitypen habe ich inzwischen auch schon auf long geändert, da int nicht funktioniert. Habt ihr noch eine Idee, wieso das Programm trotzdem keine eingaben verschlüsselt?
 

Red John

Mitglied
Als Ausgabe erwarte ich den verschlüsselten Buchstaben als Zahl. Ich stelle mir das so vor, als das die Zahleneingabe gemäß der ASCII-Tabelle umgerechnet wird nur dann gemäß dem Algorithmus: c = m^e mod N berechnet wird.

Aber es kommen immer falsche Ergebnisse raus. Dummerweise brauche ich das auch noch bis morgen :-/

Java:
 char [] c;
    String t=new String(Kon.readString());
    c=t.toCharArray();
    long m = c[0];
    long zahl5;
    System.out.println("Bitte geben sie 'e' an!");
    e = Kon.readInt();
    System.out.println("Bitte geben sie 'n' an!");
    n = Kon.readInt();
    double ergebnis; 
    long ergebnis1;
    ergebnis = Math.pow(m,e);
    ergebnis1 = (int) ergebnis;
    zahl5 = ergebnis1 % n;
    System.out.println(zahl5);    
    
    for (i=0;i<c.length;i++) {                      
        m= c[i];
        ergebnis = Math.pow(m,e);
        //System.out.print(ergebnis);
        ergebnis1 = (int) ergebnis;
        zahl5 = ergebnis1 % n;
        System.out.println(zahl5);    
      } // end of for
 

rme

Top Contributor
Wie groß sind denn die Zahlen, mit denen du arbeitest? Du berechnest e ^ m mod n ja direkt, d.h. e ^ m und dann mod n getrennt. Normalerweise ist das wegen der Größe der Zahlen unmöglich und man nimmt deshalb einen Algorithmus, der alle Operationen auf einmal macht - nennt sich ModExp. Hast du es mal mit sehr kleinen Zahlen probiert? Gib mal ein Beispiel für deine Eingaben, die Ausgabe und die erwartete Ausgabe.
 

Red John

Mitglied
Mit den ganz kleinen Zahlen wird das nichts, da der Algorithmus als Voraussetzung m < N hat.
Zuerst fragt mich das Programm nach 2 Primzahlen. Soweit so gut.
Dann den zu verschlüsselnden Text, hier tippe ich jetzt nur : "ha" ein.

Hier ein Screenshot dazu.

 
Zuletzt bearbeitet:

rme

Top Contributor
Das erste Zeichen ist h, laut ASCII-Tabelle also 104.

Nun berechnest du h ^ e, das ergibt 104 ^ 21 = 2278768068754756124569999328766699927240704

Diese Zahl überschreitet den Wertebereich von long bei weitem. Du musst also einen weitaus kleineren Schlüssel verwenden oder den ModExp-Algorithmus implementieren, dann wär's kein Problem.
 

Red John

Mitglied
Upps^^

ModExp ist zu fortschrittlich und darf ich nicht benutzen. Ein kleinerer Schlüssel ist gut, aber wie soll ich das machen.

Anhand ihrer Position im Alphabet allen Buchstaben jeweils eine Funktion zu weisen?
 

Red John

Mitglied
Danke schön, funktioniert jetzt. War dann eigentlich relativ trivial :D

Eine Frage habe ich aber doch noch:

Zahleneingaben entschlüssel ich jetzt einfach umgekehrt?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
R char aus String entfernen Allgemeine Java-Themen 10
Thallius Char +1 wird int? Allgemeine Java-Themen 7
MiMa Illegal char im Dateinamen Allgemeine Java-Themen 14
K Eingabe mit Char vergleichen klappt nicht! Allgemeine Java-Themen 2
JG12111989 char-Array in int-Array umwandeln Allgemeine Java-Themen 27
J char Allgemeine Java-Themen 3
Thallius Merkwürdiges StringBuilder verhalten (Char Encoding) Allgemeine Java-Themen 6
R Bibliothek für Darstellung von char auf 5x7 Dot-Matrix Allgemeine Java-Themen 2
S Char-index aller Buchstaben..? Allgemeine Java-Themen 3
C char und char-Array als parameter übergeben Allgemeine Java-Themen 6
J char-Array löschen Allgemeine Java-Themen 5
S Klassen Zuorgnung Object-char Allgemeine Java-Themen 2
R Beste Methode: char[] c = new String(b, CHARSET).toCharArray() ? Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
E Short in Char? Allgemeine Java-Themen 4
F Char-Array nach einem Wort durchsuchen! Allgemeine Java-Themen 11
H Vector<Character> zu char[] castern Allgemeine Java-Themen 2
T JNI String/char-Array Allgemeine Java-Themen 8
M String[] zu Char[][] mit von toCharArray() Allgemeine Java-Themen 5
G Hex 2 char Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
T Prüfen, ob Char ein Quantifier ist Allgemeine Java-Themen 6
H int in char umwandeln Allgemeine Java-Themen 7
N problem mit char Allgemeine Java-Themen 6
N Mal wieder char-encoding Probleme Allgemeine Java-Themen 5
T Frage zu char in verbindung mit int Allgemeine Java-Themen 4
B VK_? << durch char rausbekommen Allgemeine Java-Themen 8
M Class.forName und char Allgemeine Java-Themen 10
G Char-zufällig-generieren Allgemeine Java-Themen 11
T MessageDigest von einem char[] berechnen Allgemeine Java-Themen 7
Z Zeichen/char in einer Datei löschen Allgemeine Java-Themen 6
M wie wird aus char eine string kette? Allgemeine Java-Themen 4
A char in String umwandeln Allgemeine Java-Themen 3
L ein char in einem string ersetzen? Allgemeine Java-Themen 5
N char.At gibt Zeichenkette aus. aber leider 2x Allgemeine Java-Themen 10
G Wandeln von Char Wert in Zeichen? Allgemeine Java-Themen 2
U Unicode char kyrillisch Allgemeine Java-Themen 10
C String und char[] / String[] und Vector Allgemeine Java-Themen 21
L char-Zeichen per Konsole einlesen Allgemeine Java-Themen 4
N byte zu Char Allgemeine Java-Themen 1
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
D Selenium - cannot find Chrome binary Allgemeine Java-Themen 6
bueseb84 Java : Cannot find Symbol Allgemeine Java-Themen 7
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
S class path resource [config.properties}] cannot be opened because it does not exist Allgemeine Java-Themen 4
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
C Compiler-Fehler Cannot find symbol bei Hat-Beziehungen Allgemeine Java-Themen 5
Tarrew RMI Java RMI - com.sun.proxy.$Proxy1 cannot be cast to Funktionen Allgemeine Java-Themen 0
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
127.0.0.1 Methodenaufruf -cannot find symbol- Allgemeine Java-Themen 14
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
B Cannot find main-claas... Allgemeine Java-Themen 21
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M cannot be cast to java.lang.Comparable Allgemeine Java-Themen 5
K + cannot be applied Allgemeine Java-Themen 15
Tobse Cannot find symbol : construktor --- Deklariert! Allgemeine Java-Themen 9
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
X Cannot refer to a non-final variable settings inside an inner class defined in a different method Allgemeine Java-Themen 4
B cannot find Symbol Allgemeine Java-Themen 2
K java.io.IOException: Cannot validate certificate for jogl.dll Allgemeine Java-Themen 6
Saxony assert cannot be resolved Allgemeine Java-Themen 5
? Cannot run program + Vista Allgemeine Java-Themen 8
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
B aus java heraus kompillierte Klassen - cannot be resolved Allgemeine Java-Themen 3
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
R cannot be referenced! Allgemeine Java-Themen 18
R Cannot be referenced. Allgemeine Java-Themen 7
G Kompiler Fehler: cannot resolve symbol: class Allgemeine Java-Themen 4
7 Cannot resolve Symbol keyPressed Allgemeine Java-Themen 3
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
A Fehlermeldung: cannot be resolved Allgemeine Java-Themen 5
G warum operator || cannot be applied to int, double Allgemeine Java-Themen 11
D Probleme mit 'cannot execute runjava.bat' Allgemeine Java-Themen 2
G Fehlermeldung "cannot resolve symbol" Allgemeine Java-Themen 7
V Cannot resolve symbol Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben