【问题标题】:Creating a caesar cipher method using java使用java创建凯撒密码方法
【发布时间】:2013-11-26 01:24:53
【问题描述】:

我想创建一个方法,该方法将使用从 args 中获取的短语和数字。 数字形式的 args 会将短语的字母从 args 转换为数字的字母数量。

示例 javac 凯撒.java java 凯撒 abcd 1

最终结果应该打印出来 bcde

我的方法给我带来了问题..帮助?

private String encode(String num, int x)
{
    char[] charnum = args[1];
    for (x = 0; x <= charnum.length; x++)
    {
        charnum = charnum + x;
    }
    return new String(charnum);
}

我该怎么办?同样,我必须编写一个解码器方法。 我将有相同的设置,除了 for 循环的效果变为

charnum = charnum - x;

我的问题是,当我尝试编译时,出现以下错误

symbol  : variable argslocation: class Lab041
    char[] charnum = args[1];
                     ^

Lab041.java:17: operator + cannot be applied to char[],int

        charnum = charnum + x;
                          ^

2 errors

我该如何解决?我对解码方法的假设是否正确?

【问题讨论】:

    标签: java methods encryption


    【解决方案1】:

    我会从一个更简单的编码方法开始,像这样

    private static String encode(String num, int x)
    {
      StringBuilder sb = new StringBuilder();
      for (char c : num.toCharArray()) {
        sb.append((char) (c + x));
      }
      return sb.toString();
    }
    

    然后要使用它,我会使用这样的 main 方法

    public static void main(String[] args) 
    {
      if (args == null || args.length < 2) {
        System.out.println("Not enough arguments.");
        System.exit(1);
      }
      int val = Integer.valueOf(args[args.length - 1]);
      for (int i = 0; i < args.length - 1; i++) {
        if (i != 0) {
          System.out.print(' ');
        }
        System.out.print(encode(args[i], val));
      }
      System.out.println();
    }
    

    【讨论】:

      【解决方案2】:

      Charnum 是一个字符数组。你想做的事:

      for (i = 0; i <= charnum.length; i++) {
          charnum[i] = (char) (charnum[i] + x);
      }
      

      这将引用该数组的一个元素。

      另外请记住,如果您越过“z”,则没有安全防护

      也可以看看这个:Simple caesar cipher in java

      【讨论】:

      • 我按照你说的做了......并且计算机返回了可能的精度损失错误我也知道 z 问题。
      • 尝试将其转换为字符。
      • 那行不通,因为我的字符串应该比一个字符长。
      【解决方案3】:

      java cmd line args是一个字符串数组,不能简单的赋值给一个char数组,而是String类有一个方法toCharArray()

      还利用了char数据类型可以通过加法操作的事实,例如:

      char c = 'a';
      c = (char)(c + 1);  // c is now 'b'
      

      【讨论】:

      • toCharArray 技术有效,但我不遵循第二条建议。我该如何实现呢?
      【解决方案4】:

      类 CaesarCipher {

       private final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
      
       public String encrypt(String plainText,int shiftKey)
      
       {
      
             plainText = plainText.toLowerCase();
      
             String cipherText="";
      
             for(int i=0;i<plainText.length();i++)
      
             {
      
                  int charPosition = ALPHABET.indexOf(plainText.charAt(i));
      
                  int keyVal = (shiftKey+charPosition)%26;
      
                  char replaceVal = this.ALPHABET.charAt(keyVal);
      
                  cipherText += replaceVal;
      
             }
      
             return cipherText;
      
       }
      
       public String decrypt(String cipherText, int shiftKey)
      
       {
      
             cipherText = cipherText.toLowerCase();
      
             String plainText="";
      
             for(int i=0;i<cipherText.length();i++)
      
             {
      
                  int charPosition = this.ALPHABET.indexOf(cipherText.charAt(i));
      
                  int keyVal = (charPosition-shiftKey)%26;
      
                  if(keyVal<0)
      
                  {
      
                        keyVal = this.ALPHABET.length() + keyVal;
      
                  }
      
                  char replaceVal = this.ALPHABET.charAt(keyVal);
      
                  plainText += replaceVal;
      
             }
      
             return plainText;
      
       }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2020-05-31
        相关资源
        最近更新 更多