我正在使用以下代码根据特定表格置换字符串。
public static void main(String[] args) {
int[] IP = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 };
String text = "00000001 00100011 01000101 01100111 10001001 10101011 11001101 11101111".replace(" ", "");
text = Permute(text,IP);
System.out.println(text);
}
public static String Permute(String text,int [] table )
{
String keys = "0" + text;
StringBuilder sb = new StringBuilder ();
for (int i = 1 ; i <= table.length; i++)
{
sb.append(keys.charAt(table[i-1]));
}
return sb.toString();
}
更新:有没有想过创建另一种方法来获取原始字符串?类似的东西:
public static String GetoriginalText(String TextafterPermutation,int [] table )
答案 0 :(得分:1)
在语句text = Permute(text,IP);
中,您正在分配从String
函数返回的Permute
对象的引用,因此text
变量所持有的原始引用将被返回的新引用替换通过Permute
函数。
如果您想保留text
所持有的原始参考,只需使用String output = Permute(text,IP);
之类的任何其他变量。
您可以使用如下所述的简单程序:
public static String dePermute(String text, int[] table){
String keys = text;
System.out.println(table.length);
String[] str = new String[table.length];
for (int i = 1; i <= table.length; i++) {
System.out.println("Coming "+table[i - 1]);
str[table[i - 1]-1] = ""+keys.charAt(i-1);
//sb.append(keys.charAt(table[i - 1]));
}
return Arrays.toString(str).replace("[", "").replace("]", "").replace(",", "").replace(" ", "");
}
您可以使用此计划中说明的概念。我刚刚在Permute
函数中反转了您正在执行的过程。
答案 1 :(得分:1)
您可以使用根据表格映射填充的chararray
public static String RePermute(final String text, final int[] table) {
final String keys = text;
char[] chararray = new char[table.length];
for (int i = 0; i < keys.length() && i < table.length; i++) {
chararray[table[i]-1] = keys.charAt(i);
}
return new String(chararray);
}
此代码遍历您的文本,并将当前迭代的char写入表中指定的chararray位置。
注意:我的代码中存在一些问题,我保持不变。 例如,我真的不明白为什么你总是把#34; 0&#34;在你的文字前面。 此外,您可能希望处理传递的文本和表的长度不同的情况。
修改:我删除了您添加的部分&#34; 0&#34;在您传递的文本前面,而是将循环更改为从i = 0开始,而不是i = 1.
答案 2 :(得分:1)
您可以简化算法以使用字符数组而不是StringBuilder
:
public static String permute(String text,int [] table )
{
char[] chars = new char[table.length];
for (int i = 0 ; i < table.length; i++) {
chars[i] = text.charAt(table[i]-1);
}
return new String(chars);
}
之后反向算法更加明显。你只需要进行反向分配:
public static String undo(String text,int [] table ) {
char[] chars = new char[table.length];
for (int i = 0; i < table.length; i++)
{
chars[table[i]-1] = text.charAt(i);
}
return new String(chars);
}
答案 3 :(得分:1)
假设您的排列表没有改变,您可以这样做:
public static String GetoriginalText(String TextafterPermutation,int [] table ){
char[] chars=new char[table.length];
for(int i=0;i<table.length;i++){
chars[table[i] - 1] = TextafterPermutation.charAt(i);
}
return new String(chars);
}