【问题标题】:Getting a character to be represented by an int 0-25获取要由 int 0-25 表示的字符
【发布时间】:2017-02-14 03:17:39
【问题描述】:

我正在开发一个实现各种传统方法的加密程序。对于其中一些人来说,最好将我的信息表示为数字 0-25。 A 为 0,B 为 1,等等。这种移位密码就是这种情况,因为您必须使用 mod 26 进行环绕。空格和标点符号也必须保留。 这是执行移位密码的方法的代码:

public static void shift(char k, char eord)
{
    if(eord=='E' || eord=='e')
    {
        int [] mi= new int[mc.length];
        for(int i=0; i<mc.length; i++)
        {
            if ((mc[i]>='a' && mc[i]<='z') || (mc[i]>='A' && mc[i]<='Z'))
            {
                mi[i]=(int)(mc[i]+k);
                mi[i]=mi[i]%26;
                //mc[i]=(char)mi[i];
                //System.out.println(mi[i]);
            }
        }
    }
}

mc 是一个包含消息的字符数组,而 eord 是一个字符,它将确定是运行算法来加密还是解密。我的代码所做的是检查以确保 mc[i] 是一个字母,然后添加 char k (密钥),然后我将其转换为一个整数,以便我可以修改 26。有些东西不能正常工作,因为当我有一个'b'(1)键并查看整数表示是什么时,它肯定是不正确的。完成后,我还需要将其转换回字符,以便向用户提供消息的明文/密文。

【问题讨论】:

  • char b 的 ASCII 值为 98,因此如果将 b 打印为 int,您将得到 98。如果您希望它为 1,则必须从中减去 97 .这也会使a = 0、c = 2 等。这就是你要问的吗?
  • 什么是mc?这段代码看起来非常复杂,本来应该很简单。此外,0-25 不允许您表示空格或标点符号……可能不是您想要的。
  • @JimGarrison mc 是一个包含消息的字符数组。即如果消息是“hello” mc[0]='h', mc[1]='e' 等等。我也不需要更改空格和标点符号,因此我只需要数字 0-25。此外,如果我只使用 ASCII 码值,加密方法将无法正常工作。 'A' 和 'a' 必须被视为“同一事物”
  • @MegumiAi 在这种情况下,您可以使用mi[i]%32-1Aa 变为0 等。
  • 注意:换行已经是 10(也可能是 13)

标签: java encryption char int


【解决方案1】:

要获得一个字符的整数值 0..25,您需要确保您只获得字母表中的大写或小写字符。

让我们假设小写。然后,您可以通过减去'a' 字符的值来简单地将字符转换为整数。由于字符值按照正常字母表中的顺序排列,因此'a' 的值为 0,'z' 的值为 25...,并且介于两者之间的所有字母也将获得正确的值。

我会显示一个小写版本,因为我不喜欢大喊:

public class CharacterToZeroBasedIntegerRange {

    public static int characterToIntegerRange(char c) {
        if (c < 'a' || c > 'z') {
            throw new IllegalArgumentException(String.format("Character with value %04X is not a letter", (int) c));
        }

        return c - 'a';
    }

    public static void main(String[] args) {
        String test = "Hello world!".toLowerCase().replaceAll("[^a-z]", "");
        System.out.println(test);
        for (int i = 0; i < test.length(); i++) {
            char c = test.charAt(i);
            System.out.println(characterToIntegerRange(c));
        }
    }
}

【讨论】:

  • 然后要将整数转回字符,我将有一个 char 函数,该函数有一个 int 作为参数并将“a”添加到 int 对吗?
  • 是的,逆向算法,你就成功了。不过,您需要强制转换它,因为 int + char 将返回 int 而不是 char(所以 (char) (v + 'a') 应该这样做)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多