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…这也将解决您未能告诉我们的边界外异常问题!
请注意:我相信我的“解决方案”会导致偶数长度字符串失败,但我的工作不是为您做功课。:)谢谢,我甚至没有想到这一点。而且这也不是问题,只是一个包罗万象的问题;如果它真的超出了界限,那就意味着它已经完成了。这本来不应该发生,但只是以防万一。我习惯于使用硬件,所以这是我的一种心态。