Java反汇编字符串偶数长度有效,但奇数长度无效

Java反汇编字符串偶数长度有效,但奇数长度无效,java,string,algorithm,sorting,decode,Java,String,Algorithm,Sorting,Decode,我正在写一个有多种编码方案的程序,其中一种是素数移位,基于密钥是偶数还是奇数。 解码方案如下: 检查键以查看它是奇数还是偶数。对于奇数键,奇数编号的字符在新字符串中顺序排列,然后是所有偶数索引。如果键为偶数,则所有偶数索引都是第一个,然后是所有奇数索引 因此,对于字符串“abcdefg”和键27,新字符串应为“bdfaceg” 如果键为28,则新字符串应为“acegbdf” 奇怪的是 如果键是奇数,而字符串长度是奇数或偶数,则它可以完美解码。 如果键为偶数且字符串长度为偶数,则可以很好地解码 但

我正在写一个有多种编码方案的程序,其中一种是素数移位,基于密钥是偶数还是奇数。 解码方案如下:

检查键以查看它是奇数还是偶数。对于奇数键,奇数编号的字符在新字符串中顺序排列,然后是所有偶数索引。如果键为偶数,则所有偶数索引都是第一个,然后是所有奇数索引

因此,对于字符串“abcdefg”和键27,新字符串应为“bdfaceg” 如果键为28,则新字符串应为“acegbdf”

奇怪的是 如果键是奇数,而字符串长度是奇数或偶数,则它可以完美解码。 如果键为偶数且字符串长度为偶数,则可以很好地解码

但是如果密钥是偶数,而字符串长度是奇数,则无法正确解码。

使用测试字符串“在此处输入消息”。以下是我的输出:

Encoded Key = 28 ; Encoded Message "EtrMsaehr.ne esg ee" Message length = 19
Decoded Key = 28 ; Decoded Message "E.tnreM seasegh renull"
所以偶数的条目在正确的位置,但奇数的条目要么需要反向拉取,要么在奇数索引上向后推,我认为。。。 我认为将它们向后推一个索引是最容易的,但我对Java还是相当陌生,我不知道如何做到这一点

下面是我在这个实例中使用的函数的代码

protected String decode(String a, int k)
{
    System.out.println(a.length());
    String[] out = new String [a.length()];
    String decode = a;
    int key = k;
    boolean kP = IsEven(key);
    String odd = "";

    if (kP)
    {
        //Key is even
        try
        {
            int f = 0;
            for (int i =0 ; i<(a.length()/2); i++)
            {
                out[f] = Character.toString(a.charAt(i));
                f+=2;
            }
            int g = 1;
            for (int i = (a.length()/2) ; i<(a.length()); i++)
            {
                out[g] = Character.toString(a.charAt(i));
                g+=2;
            }
        }
        catch ( IndexOutOfBoundsException e )
        {
            System.out.println("Out of bounds");
            while(true)
                break;
        }
    }
    else
    {
        //key is odd
        try
        {
            int f = 1;
            for (int i =0 ; i<(a.length()/2); i++)
            {
                    out[f] = Character.toString(a.charAt(i));
                    f+=2;
            }

            int g = 0;
            for (int i = (a.length()/2) ; i<(a.length()); i++)
            {
                    out[g] = Character.toString(a.charAt(i));
                    g+=2;
            }
        }
        catch ( IndexOutOfBoundsException e )
        {
            System.out.println("Out of bounds");
            while(true)
                break;
        }
    }
    for (int i = 0 ; i<a.length(); i++)
            odd += out[i];
        System.out.println(odd);
    return(odd);
}
受保护字符串解码(字符串a,整数k)
{
System.out.println(a.length());
String[]out=新字符串[a.length()];
字符串解码=a;
int key=k;
布尔kP=IsEven(键);
字符串奇数=”;
如果(kP)
{
//钥匙是平的
尝试
{
int f=0;

对于(int i=0;i而言,对于一些简单的示例,即使是手工操作,也要逐步完成代码:

  • 键:2;字符串:“A”

  • 键:2;字符串:“AB”

  • 关键字:2;字符串:“ABC”

  • 等等


详细检查发生了什么。当您知道发生了什么时,您可以纠正问题。

您的问题是,当它是偶数键和奇数字符串时,编码字符串的第一个“序列”中还会有一个字符,您不必对此进行解释:

如果键为28,则新字符串应为“acegbdf”

上面的示例首先有4个字符,然后是3个字符

在代码中,您运行的是
(a.length()/2)
,上面的字符串中是3,这意味着您使用的是索引0、1和2。而您真正想要的是使用0、1、2和3(“aceg”)

解决方案是在偶数键的两个for循环中的条件中添加1…这也将解决您未能告诉我们的边界外异常问题!


请注意:我相信我的“解决方案”会导致偶数长度字符串失败,但我的工作不是为您做功课。:)

谢谢,我甚至没有想到这一点。而且这也不是问题,只是一个包罗万象的问题;如果它真的超出了界限,那就意味着它已经完成了。这本来不应该发生,但只是以防万一。我习惯于使用硬件,所以这是我的一种心态。