【发布时间】:2014-03-28 15:10:57
【问题描述】:
我正在用 java 编写 SDES 密码,进入将两个长度为 5 的数组向左移动一个空格的阶段,这对于 p10kleft 变为 shiftp10kleft 来说很好,但是当我将相同的代码应用于 p10kright 时变成 shiftp10kright 它会在末尾添加一个随机 1,而不是将第一个 0 移到最后一位。
这是我的代码:
package ciphers;
import java.io.*;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
public class SDESNew {
public static void main(String []arg)throws Exception
{
int[] k = {1,1,1,1,0,1,1,0,0,0};
int[] P10 = {3,5,2,7,4,10,1,9,8,6};
int[] P8 = {6,3,7,4,8,5,10,9};
int[] P4 = {2,4,3,1};
int[] IP = {2,6,3,1,4,8,5,7};
int[] EP = {4,1,2,3,2,3,4,1};
int S0[][] = {
{1,0,3,2},
{3,2,1,0},
{0,2,1,3},
{3,1,3,2}
};
int S1[][] = {
{0,1,2,3},
{2,0,1,3},
{3,0,1,2},
{2,1,0,3}
};
//Arrays that we have to calculate
int p10k[]=new int[10]; //Create p10(k) array
int[] p10kleft = new int[5];
int[] p10kright = new int[5];
int[] shiftp10kleft = new int[5];
int[] shiftp10kright = new int[5];
for(int i=0;i<10;i++)
{
System.out.println("Value from array P10: " +P10[i]); //Printing values from array P10
System.out.println("Array position to be used in array k: " +(P10[i]-1)); //Array position begins at 0 so subtracting 1 from P10 position so array begins at 0
System.out.println(k[P10[i]-1]); //Printing values in array positions
p10k[i]=k[P10[i]-1]; //Putting array values in p10k array
System.out.println("");
}
System.out.println("P10k: " +Arrays.toString(p10k)); //Printing out all values in p10k array
System.arraycopy(p10k, 0, p10kleft, 0, p10kleft.length);
System.arraycopy(p10k, p10kleft.length, p10kright, 0, p10kright.length);
System.out.println("Left: " +Arrays.toString(p10kleft));
System.out.println("Right: " +Arrays.toString(p10kright));
// System.arraycopy(p10kleft, 1, shiftp10kleft, 0, p10kleft.length - 1);
int n = p10kleft.length;
shiftp10kleft = p10kleft;
int i = 0;
if (n>0)
{
for(i=0; i<n-1; i++)
{
p10kleft[i]=p10kleft[i+1];
}
}
p10kleft[i] = shiftp10kleft[i];
System.out.println("Shift Left: " +Arrays.toString(shiftp10kleft));
n = p10kright.length;
shiftp10kright = p10kright;
i = 0;
if (n>0)
{
for(i=0; i<n-1; i++)
{
p10kright[i]=p10kright[i+1];
}
}
p10kright[i] = shiftp10kright[i];
System.out.println("Shift Right: " +Arrays.toString(shiftp10kright));
}
}
这是当前的输出:
Value from array P10: 3
Array position to be used in array k: 2
1
Value from array P10: 5
Array position to be used in array k: 4
0
Value from array P10: 2
Array position to be used in array k: 1
1
Value from array P10: 7
Array position to be used in array k: 6
1
Value from array P10: 4
Array position to be used in array k: 3
1
Value from array P10: 10
Array position to be used in array k: 9
0
Value from array P10: 1
Array position to be used in array k: 0
1
Value from array P10: 9
Array position to be used in array k: 8
0
Value from array P10: 8
Array position to be used in array k: 7
0
Value from array P10: 6
Array position to be used in array k: 5
1
P10k: [1, 0, 1, 1, 1, 0, 1, 0, 0, 1]
Left: [1, 0, 1, 1, 1]
Right: [0, 1, 0, 0, 1]
Shift Left: [0, 1, 1, 1, 1]
Shift Right: [1, 0, 0, 1, 1]
我需要右移才能正确输出 [1, 0, 0, 1, 0]
【问题讨论】:
-
你为什么使用数组?这似乎是一种非常 C++-y 的做事方式,它不像移植到 Java 那样容易。您可以更轻松地采用 C-y 方式并使用按位运算,例如
long,或者采用 Java-y 方式并将它们包装在自己的界面中。 -
我更喜欢这种方法,但我只是很困惑为什么我用来生成 p10kleft 的相同代码不能以相同的方式生成 p10kright
-
在我看来
p10kleft[i] = shiftp10kleft[i];应该改为p10kleft[i] = shiftp10kleft[0];。我不完全清楚你的代码是做什么的,所以我可能是错的。无论哪种情况,请考虑至少使用Arrays.copyOfRange(),而不是自己动手。 -
shiftp10kleft 工作正常,它正确地将 p10kleft 数组的每个元素向左移动。我正在尝试对 p10kright 做同样的事情,但它不起作用
-
是的,但是您似乎使用该行将相同的值(数组中的最后一个值)分配回自身。看起来您的意思是将旧的第 0 个元素分配给新的最后一个元素。
标签: java arrays encryption shift