java - Java 中的 Caesar Cipher 无法识别这些方法

标签 java encryption non-static

<分区>

你好,我的 java 程序凯撒密码有问题: 它给了我这个错误:

CifrarioCesare.java:27: error: non-static method cripta(String,int) cannot be referenced from a static context
            c = cripta(s, spost);
                ^
CifrarioCesare.java:31: error: non-static method decripta(String,int) cannot be referenced from a static context
            c = decripta(s, spost);
                ^
2 errors

这是代码

import java.util.*;
/*
Cifrario di Cesare
*/
public class CifrarioCesare
{
public static void main(String[] args)
{
    String c;
    System.out.println(" ");
    System.out.println("\t#################################");
    System.out.println("\t####### Cifrario Di Caesar ######");
    System.out.println("\t### ........................ ###");
    System.out.println("\t############# Crypt #############");
    System.out.println("\t#################################");
    System.out.println(" ");
    Scanner t = new Scanner(System.in);
    System.out.println("> Desideri codificare o decodificare un messaggio?\n(1) Codifica\n(2) Decodifica");
    int code = t.nextInt();
    System.out.println("> Scrivi la stringa  da codificare");
    String s = t.nextLine();
    s = s.replaceAll(" ","");
    System.out.print("> Scrivi la chiave numerica intera: ");
    int spost = t.nextInt();
    if (code==1)
    {
        c = cripta(s, spost);
    }
    else if (code==2)
    {
        c = decripta(s, spost);
    }
    else
    {
        System.exit(0);
    }
    System.out.print("> Stringa criptata:\n\t" + c + "\n\n");
}

/* Cript */

public String cripta(String s, int spost) 
{
    String alfabeto = "abcdefghijklmnopqrstuvwxyz";
    String stringa = "";
    // ex: s = "ciao" -> j=4
    int j = s.length();
    int index;
    char y;
    // per i che va da zero a 4 (non compreso)...
    for (int i=0; i<j; i++)
    { // inizia ciclo for
        // se i=0, y="c".. i=1, y="i".. i=2, y="a".. i=3, y="o"
        y = s.charAt(i);
        // se y="c", string.indexOf("c") va a cercare dove quel carattere è 
        // situato nell'alfabeto. In questo caso (partendo da a=0, b=1...) 
        // il carattere "c" è uguale a 2, quindi index=2.
        /*  ---------------------
        >>> stessa cosa per le altre lettere <<<
            ---------------------     */
        index = alfabeto.indexOf(y);
        // ora inserisco in y il nuovo carattere "crittografato" perchè
        // aggiungo al carattere iniziale lo spostamento inserito dall'utente
        /* In pratica:
            Se spost=3; (con l'alfabeto semplificato)
            "c"+3="f".."i"+3="n".. ecc..    
        Il problema quel'e'? Che se la ad esempio ho "z"+3 dovrebbe essere "c", 
        ma per far questo, devo impostare un while in modo che 
        se la somma è maggiore di 27 (z=25) -> 25+3=28, e non va bene perchè la stringa alfabeto
        arriva massimo a 25, quindi se è maggiore devo cavare 26 cosicche torni entro i 25 caratteri */
        while ((index+spost)>25)
        {
            index -= 26;
        }
        y = alfabeto.charAt(index+spost);
        // infine inserisco nella nuova stringa volta per volta i nuovi caratteri
        // N.B. a+=b corrisponde ad a=a+b
        stringa += y;
    } // fine ciclo for
    // ora restituisco la stringa finale criptata
    return stringa;
}

/* Decript */

public String decripta(String s, int spost) 
{
    String alfabeto = "abcdefghijklmnopqrstuvwxyz"; 
    String stringa = "";
    // ex: s = "afjgr" -> j=5
    int j = s.length();
    int index;
    char y;
    // per i che va da zero a 5 (non compreso)...
    for (int i=0; i<j; i++)
    { // inizia ciclo for
        y = s.charAt(i);
        index = alfabeto.indexOf(y);
        while ((index-spost)<0)
        {
            index += 26;
        }
        y = alfabeto.charAt(index-spost);
        stringa += y;
    } // fine ciclo for

    // ora restituisco la stringa finale decriptata
    return stringa;
}
}

我尝试在这两个函数中编写静态代码,但我遇到了主要问题。 我该怎么办? (我不想将它写在 2 个文件中或使用另一个类,我想在一个独特的文件中进行。 如果可能的话,我问你如何做。 谢谢。

最佳答案

在 main 方法中,创建您的类的实例并使用它来调用您的方法。

CifrarioCesare cc = new CifrarioCesare();
if (code==1){
    c = cc.cripta(s, spost);
}else if (code==2){
    c = cc.decripta(s, spost);
}

关于java - Java 中的 Caesar Cipher 无法识别这些方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19489352/

相关文章:

c++ - 隐式对象参数和 this 指针

java - 通过反射更改最终变量,为什么静态和非静态最终变量之间存在差异

java - 如何在 java 中使用 AES 加密设置 block 大小和 key 大小

java - 加密难题

java - java中如何使用secp256r1椭圆曲线 key 对进行加解密?

java - Java 中静态和非静态前向引用的内部工作

java - 从 C# 中的 List 获取对象变量

java - 使用带有 Tomcat 的 Jersey/Spring 在 REST 中注入(inject)时出错

java - 如何为组合编写递归函数

java - 在非静态方法内调用没有类实例的非静态方法