这是使用铁栅栏密码进行加密和解密的整个程序。我在最后一行但第四行得到ArrayIndexOutOfBoundsException
。请帮助我理解并修复此错误。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Pratheesh
*/
public class Test {
public void encrypt2(String line,int rail)
{
int shift=0,p=0,itr;
for(int i=0;i<rail;i++)
{
p=i;
if(i==0||i==rail-1)
shift=((rail-2)*2)+2;
itr=1;
while(p<line.length())
{
System.out.print(line.charAt(p));
if(i!=0&&i!=rail-1)
{
shift=((rail*itr-itr)-p)*2;
}
p+=shift;
itr++;
}
}
}
public void decrypt2(String line,int arr[])
{
int ptr[]=new int[arr.length+1];
int p1=0,p2=0,p3=0,c=1;
boolean chk=true;
System.out.print(line.charAt(ptr[p3]+p1));
ptr[p3]++;
while(c<line.length())
{
if(chk)
{
p1+=arr[p2];
p2++;
p3++;
}
else
{
p1-=arr[p2];
p2--;
p3--;
}
System.out.print(line.charAt(ptr[p3]+p1));
c++;
ptr[p3]++;
if(p2==arr.length)
{
p2--;
chk=false;
}
else if(p2==-1)
{
p2++;
chk=true;
}
}
}
public static void main(String args[]) throws IOException, ArrayIndexOutOfBoundsException{
Test obj=new Test();
String line;
int rail,arr[],temp;
line="Password";
rail=Integer.valueOf(2);
temp=line.length()-rail;
int spaces;
if(temp%(rail-1)!=0)
{
spaces=(rail-1)-(temp%(rail-1));
if((temp/(rail-1))%2!=0)
{
spaces+=rail-1;
}
}
else
{
spaces=temp%(rail-1);
if((temp/(rail-1))%2==0)
{
spaces+=rail-1;
}
}
for(int g=0;g<spaces;g++)
line+=' ';
obj.encrypt2(line,rail);
//Decryption
temp=line.length()-rail;
arr=new int[rail-1];
if((temp/(rail-1))%2==0)
arr[0]=1+(temp/(rail-1))/2;
else
arr[0]=1+((temp/(rail-1))+1)/2;
arr[1]=arr[0]*2-2;
for(int i=2;i<rail-1;i++)
arr[i]=arr[1]
obj.decrypt2(line,arr);
}
}
答案 0 :(得分:2)
分配新数组时,方括号中的数字是数组中元素的数量,不是数组最后一个元素的索引。因此,如果您想要一个包含两个元素arr[0]
和arr[1]
的数组,则需要说
arr = new int[2]; // or some expression whose value is 2
不
arr = new int[1]; // there will be only one element, arr[0]
我怀疑错误是因为您尝试分配给arr[1]
,但数组只有一个元素。