Java字符串是不可变的,所以你不能操作他们的数据。但是,如果你可以重写你的编码功能使用字符数组:
public static String encrypt(int key, String plainT)
{
char[] res = new char[plainT.length()];
int k = 0;
for (int j = 0; j < key; j++) {
for (int i = j; i < plainT.length(); i += key) {
res[k++] = plainT.charAt(i);
}
}
return String.copyValueOf(res);
}
然后你就可以轻松地恢复的过程:
public static String decrypt(int key, String encT)
{
char[] res = new char[encT.length()];
int k = 0;
for (int j = 0; j < key; j++) {
for (int i = j; i < encT.length(); i += key) {
res[i] = encT.charAt(k++);
}
}
return String.copyValueOf(res);
}
的连接用辅助char
阵列和一个额外的指数在这里实现k
。恢复过程与恢复索引相同。 (这意味着解密阵列没有按照顺序填充,就像原始字符串不能从加密顺序读取一样)。
(警告:我不熟悉Java,所以我希望改变char数组并将其转换为字符串工程,我希望也,我还没有告诉有关Java String的完全胡说八道。)
附录你也可以用你的原始级联的代码为基础,但它会更复杂一点。您的列式加密可表示为:
H o r
e _ l
l W d
l o
加密的字符串是水平读取的,即垂直解密的原始字符串。如果你的字符串是"Hello World!"
,带有一个excamation标记,你会得到一个长度为12的字符串,你可以使用原始代码和一个12/4 == 3
的回复键。
但我们实际上有一个变量键:第一行是3,最后一行是2。
public static String decrypt(int key, String str)
{
String out = "";
int skip = str.length()/key;
int rest = str.length() % key * (skip + 1);
for (int j = 0; j < skip; j++) {
int i = j;
while (i < str.length()) {
out += str.charAt(i);
i += skip;
if (i < rest) i++;
}
}
for (int i = skip; i < rest; i += skip + 1) {
out += str.charAt(i);
}
return out;
}
内环现在有skip
或skip + 1
一个键,这取决于字符串的区域。最后一列(上面的草图)在一个单独的循环中处理,因为它看起来更整齐。
如果您不是追加到最初的空字符串,反向操作很容易,但是以与加密字符串相同长度的虚拟字符串开始,所有空格开始,比方说,然后根据'j'。 – 2014-09-13 09:29:15
我很难搞清楚会让“Hore llWdlo”回馈“Hello World”的代码。什么是它的反向代码? – Learner 2014-09-13 11:54:57
既然你是一个自称的学习者,我可能想为你自己弄清楚。但是我犯了一个错误,因为我对Java不熟悉:Java字符串似乎是不可变的,所以我的建议不起作用。对不起。 – 2014-09-13 12:21:29